在C++中,生成随机数的最佳方法是什么?

20 浏览
0 Comments

在C++中,生成随机数的最佳方法是什么?

生成随机数的最佳方式是什么?

0
0 Comments

在C++中生成随机数的最佳方法是使用<random>库。在C++11之前,可以在TR1库中找到类似的实现,也可以在Boost.random库中找到类似的接口。

以下是一个示例代码:

#include 
typedef std::mt19937 rng_type;
std::uniform_int_distribution udist(0, 7);
rng_type rng;
int main()
{
  // 首先设置随机数种子:
  rng_type::result_type const seedval = get_seed(); // 从某个地方获取种子值
  rng.seed(seedval);
  rng_type::result_type random_number = udist(rng);
  return random_number;
}

在这个示例中,我们使用了`mt19937`引擎和`uniform_int_distribution`分布来生成随机数。首先需要设置随机数种子,然后通过引擎和分布来生成随机数。

如果想要更简洁的代码,可以将引擎和分布绑定在一起,然后通过构造函数传入种子值:

auto rand = bind(uniform_int_distribution<>(0,7),mt19937(get_seed()));

关于种子值的获取,可以使用`std::random_device`来获取。不同的实现可能会有不同的质量,但可以作为一个起点。

总结起来,使用<random>库中的`mt19937`引擎和`uniform_int_distribution`分布是在C++中生成随机数的最佳方法。可以使用`std::random_device`来获取种子值,然后通过设置种子值和引擎来生成随机数。

0
0 Comments

在C++中生成随机数的最佳方法是什么?

如果满足以下条件:

- 你不需要“完美均匀性”,或者

- 你没有C++11支持,甚至没有TR1(因此没有其他选择)

那么你可以考虑使用下面的C风格解决方案,这是为了维护这个社区的声誉(参见rand() Considered Harmful)而使用了删除线字体编写的:

下面是一个简单的C风格函数,它生成从min到max(包括min和max)之间的随机数。这些数字似乎非常接近均匀分布。

int irand(int min, int max) {
    return ((double)rand() / ((double)RAND_MAX + 1.0)) * (max - min + 1) + min;
}

在使用它之前不要忘记调用srand:

int occurrences[8] = {0};
srand(time(0));
for (int i = 0; i < 100000; ++i)
    ++occurrences[irand(1,7)];
for (int i = 1; i <= 7; ++i)
    printf("%d ", occurrences[i]);

输出结果为:14253 14481 14210 14029 14289 14503 14235

此外,还可以参考以下链接:

- Generate a random number within range?

- Generate random numbers uniformly over an entire range

如果满足其他条件,可以使用,就像Kerrek SB已经指出的那样。

你的irand实现并不产生均匀分布的随机数:如在rand() considered harmful的讲话中所解释的,有些值比其他值更有可能出现。你的例子在7分30秒处有所描述。

公正地说,演讲者认为你的实现只是“微妙”地非均匀,而不是其他“极其”非均匀的解决方案。我自己在使用rand()时犯过更严重的错误... 😉

但是,如果有可用,为什么不选择它呢?它更简洁、更好。它也可以像我的irand一样封装成一个独立的辅助函数。

别误会我的意思,我并不是在提倡使用你的实现而不是,只是指出还有更糟糕的错误可以犯。当然,如果有可用,应该优先选择它,但是如果你必须使用rand(),那么你的解决方案可能是我们能得到的最好的解决方案之一。

rand()对我的单元测试很好用。但是在Unix系统上,你至少可以从/dev/random或/dev/urandom加载字节。此外,OpenSSL库提供了RAND(尝试man RAND和man RAND_bytes)。

0
0 Comments

C++中生成随机数的最佳方法是使用Boost.Random库。该库可以产生伪随机数(如果平台支持,则可以产生真正的随机数)。

通过查看Boost.Random文档,我确认他们并未声称可以产生真正的随机数。那么为什么你在回答中提到了这一点呢?

Boost.Random库中包含了非确定性均匀随机数生成器“random_device”(现在已经成为标准的头文件也包含了它),它用于在具有此类设备的平台上提供对非确定性均匀随机数生成器的访问(例如,操作系统通过观察网络流量等方式收集随机数据,并通过/dev/random提供对该数据的访问)。

0