我遇到了一个问题,我真的需要用一个双值的随机数生成器来种子。生成的随机数应介于{min,max}之间。我目前的解决方案是
double map(double in, double min, double max){
size_t seed = std::hash<double>()(in);
unsigned int seed2 = (unsigned int)(seed >> (sizeof(size_t)-sizeof(unsigned int)));
std::mt19937 gen{seed2};
std::uniform_real_distribution<double> dis(min, max);
return dis(gen);
}上面的问题是,size_t的散列在所有平台上都不是相同的。因此,期望的结果会在不同的平台上有所不同。该算法能否在所有平台上为相同的输入生成相同的输出,同时仍然是伪随机的。
在https://godbolt.org/z/rfT3ajbbo的例子
关于64位gcc构建的输出是
0.9223
0.0733052
0.0168922
0.993303
0.330736关于32位gcc构建的输出是
0.121904
0.188877
0.839134
0.984475
0.171036发布于 2022-08-05 15:32:22
为什么需要散列double?您只需使用它的二进制模式作为种子。
double map(double in, double min, double max){
auto seed = std::bit_cast<uint64_t>(in);
auto seed2 = uint32_t((seed >> 32) | seed);
std::mt19937 gen{seed2};
std::uniform_real_distribution<double> dis(min, max);
return dis(gen);
}
double map2(double in, double min, double max){
auto seed = std::bit_cast<uint64_t>(in);
std::mt19937_64 gen{seed};
std::uniform_real_distribution<double> dis(min, max);
return dis(gen);
}https://stackoverflow.com/questions/73246643
复制相似问题