gpt4 book ai didi

c++ - 1 到 15 之间的随机数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:32 25 4
gpt4 key购买 nike

我在 C++ 中生成了很多需要介于 1 和 15(含)之间的随机数。当然,我可以生成 zillons std::uniform_int_distribution<std::mt19937::result_type> random(1, 15);但这是一种浪费,因为这个 mersenn twister 生成 32 位(或者使用 mt19937_64 甚至是 64 位)的随机值,我只会保留 4 位并丢弃所有其余的,在我的情况下,性能是一个问题和随机数生成是一个重要的贡献者。

因此,我的想法是生成一个介于 0 和 2^64-1 之间的 64 位随机值,并从中选择 4 位。问题是我找不到让生成的值介于 1 和 15 之间的方法。示例:

unsigned long long int r = uniform(generator); // between 0 and 2^64-1
unsigned int r1 = (r+1)&15; // first desired random value
unsigned int r2 = ((r>>4)+1)&15; //second desired random value
unsigned int r3 = ((r>>8)+1)&15; //third desired random value
...

在这里,这个版本当然不起作用:尽管有 +1,生成的值仍然在 0 到 15 之间(因为如果 r&15 恰好是 0xb1111 那么加 1 会产生结果 0xb0000 ) .

此外,我希望分布保持均匀(例如,我不想让最低有效位出现得更频繁,这可能是类似 (r&15+1)|((r&15 +1) >> 4) 的情况,因为值 0xb0001会经常发生两次)。

最佳答案

代替

std::mt19937 gen(seed);
std::uniform_int_distribution<> dis(1, 15);

auto r1 = dis(gen);
auto r2 = dis(gen);
auto r3 = dis(gen);
auto r4 = dis(gen);

你可能会这样做:

std::mt19937 gen(seed);
std::uniform_int_distribution<> dis(0, 15 * 15 * 15 * 15 - 1); // Assuming int at least 16 bits

auto r = dis(gen);

auto r1 = r % 15 + 1; r /= 15;
auto r2 = r % 15 + 1; r /= 15;
auto r3 = r % 15 + 1; r /= 15;
auto r4 = r + 1;

Quick benchmark (第二个版本比第一个版本快 2.5 倍)

关于c++ - 1 到 15 之间的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56979752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com