5

我正在用 C/C++ 编写,我想创建很多大于 100,000 的随机数。我会怎么做?和rand();

4

4 回答 4

15

你不会这样做rand,但是使用较新的 C++ 附带的适当的随机数生成器,请参见例如cppreference.com

const int min = 100000;
const int max = 1000000;
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(min,max);
int random_int = distribution(generator);  // generate random int flat in [min, max]

不要忘记正确播种您的发电机。

上面我暗示这rand不是一个“正确的”伪RNG,因为它通常带有许多缺点。在最好的情况下,它缺乏抽象,因此从不同的分布中挑选变得困难且容易出错(在网上搜索“随机范围模数”)。同样,替换用于生成随机数的底层引擎也是 AFAIK 设计上不可能的。在不太理想的情况下rand,因为伪 RNG 不能为许多/大多数用例提供足够长的序列长度。使用 TR1/C++11 生成高质量的随机数很容易始终使用正确的解决方案,因此当出现模糊的错误时,无需首先担心使用的伪随机数发生器的质量。微软'

于 2012-11-21T23:27:01.723 回答
2
// Initialize rand()'s sequence. A typical seed value is the return value of time()
srand(someSeedValue);

//...

long range = 150000; // 100000 + range is the maximum value you allow
long number = 100000 + (rand() * range) / RAND_MAX;

您可能需要使用大于 long int 的东西rangenumber如果(100000 + range)将超过其最大值。

于 2012-11-21T23:26:42.477 回答
2

通常,您可以使用介于 0 和 1 之间的随机数生成器,并通过执行以下转换获得所需的任何范围:

x' = r x + b

因此,如果您想要介于 100,000 和 300,000 之间的随机数,并且x您的随机数介于 0 和 1 之间,那么您将设置r为 200,000 和b100,000,并且x'将在您想要的范围内。

于 2012-11-21T23:29:07.883 回答
1

如果您还没有访问 C++ 内置函数,Boost 在Boost.Random中有一堆真正的随机化器,包括针对您明显问题空间的特定解决方案。

我会回应评论,澄清您问题中的编辑将提高答案的准确性,例如。“我需要从 100,001 到 1,000,000 的均匀分布整数”。

于 2012-11-21T23:36:51.307 回答