小编kai*_*ong的帖子

从 <random> 重复重新播种 PRNG 是不可重现的

<random>C++中有确定性随机数生成器吗?

有问题的一点是我的 Windows 机器上的以下代码:

#include<iostream>
#include<random>
int main(){
  std::mt19937 g;
  std::normal_distribution<double> d;
  for(int i=0;i<100;++i){
    g.seed(65472381);
    std::cout << "List[65472381] = " << d(g) << "\n";
  }
}
Run Code Online (Sandbox Code Playgroud)

产生以下结果:

List[65472381]=0.972683
List[65472381]=-0.773812
List[65472381]=0.972683
List[65472381]=-0.773812
List[65472381]=0.972683
List[65472381]=-0.773812
...
Run Code Online (Sandbox Code Playgroud)

我的困惑在于,尽管使用了之前每次0.972683 != -0.773812重置的种子。65472381g

我的处理器是Zen 2,操作系统是 Windows 10 Pro,版本 22H2。编译器是GCC(x86_64-w64-mingw32/12.2.0)。但通过在不同的虚拟机和编译器上在线测试代码,结果似乎在您的计算机上也可能是相同的。

真正寻求的是一种从任意固定通用列表中获取第 i 个数字的方法,该通用列表长度为 4,294,967,295,随机分布的数字在 SPACETIME O(1) 中,这意味着该列表中没有任何元素被存储。

c++ random-seed mt19937

6
推荐指数
1
解决办法
127
查看次数

解决赋值构造函数 C++ 中的歧义

描述

当存在某个构造函数时,我的代码不明确。但是,当我注释掉所述构造函数时,编译器会抱怨缺少必要的构造函数。

最小工作示例

struct X;

struct E{
    E(const double& r){ /* important protocol stuff */ }
    E(const X&);
};

struct X{
    X(){ /* important init stuff */ }
    ~X(){ /* important delete stuff */ }
    //X(const double& r){ *this=E(r); }  // POSITION 1
    X(const X& x){ /* important init stuff */ *this=x; }
    X(const E& e){ /* important init stuff */ *this=e; }
    const X& operator=(const X& x){ return *this=E(x); }
    const X& operator=(const E& e){ /* important stuff */ …
Run Code Online (Sandbox Code Playgroud)

c++ g++ llvm ambiguous

2
推荐指数
1
解决办法
102
查看次数

标签 统计

c++ ×2

ambiguous ×1

g++ ×1

llvm ×1

mt19937 ×1

random-seed ×1