我正在用 C/C++ 编写,我想创建很多大于 100,000 的随机数。我会怎么做?和rand();
4 回答
你不会这样做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 生成高质量的随机数很容易始终使用正确的解决方案,因此当出现模糊的错误时,无需首先担心使用的伪随机数发生器的质量。微软'
// 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 的东西range
,number
如果(100000 + range)
将超过其最大值。
通常,您可以使用介于 0 和 1 之间的随机数生成器,并通过执行以下转换获得所需的任何范围:
x' = r x + b
因此,如果您想要介于 100,000 和 300,000 之间的随机数,并且x
您的随机数介于 0 和 1 之间,那么您将设置r
为 200,000 和b
100,000,并且x'
将在您想要的范围内。
如果您还没有访问 C++ 内置函数,Boost 在Boost.Random中有一堆真正的随机化器,包括针对您明显问题空间的特定解决方案。
我会回应评论,澄清您问题中的编辑将提高答案的准确性,例如。“我需要从 100,001 到 1,000,000 的均匀分布整数”。