首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在64或32位平台上播种带有双的随机数生成器并使其生成相同的序列。

在64或32位平台上播种带有双的随机数生成器并使其生成相同的序列。
EN

Stack Overflow用户
提问于 2022-08-05 08:14:54
回答 1查看 160关注 0票数 0

我遇到了一个问题,我真的需要用一个双值的随机数生成器来种子。生成的随机数应介于{min,max}之间。我目前的解决方案是

代码语言:javascript
复制
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构建的输出是

代码语言:javascript
复制
0.9223
0.0733052
0.0168922
0.993303
0.330736

关于32位gcc构建的输出是

代码语言:javascript
复制
0.121904
0.188877
0.839134
0.984475
0.171036
EN

回答 1

Stack Overflow用户

发布于 2022-08-05 15:32:22

为什么需要散列double?您只需使用它的二进制模式作为种子。

代码语言:javascript
复制
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);
}

哥德螺栓演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73246643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档