我正在用C / C ++编写,我想创建大量超过100,000的随机数。我该怎么做?使用rand();
答案 0 :(得分: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设计。在不太理想的情况下,作为伪RNG的rand
不能为许多/大多数用例提供足够长的序列长度。使用TR1 / C ++ 11生成高质量的随机数很容易总是使用正确的解决方案,因此当出现模糊的错误时,不需要首先担心使用的伪RNG的质量。微软的STL做了一个演讲,在GoingNative2013上给出了一个很好的summary talk主题。
答案 1 :(得分: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;
如果range
超过其最大值,则number
和(100000 + range)
可能需要使用大于long int的内容。
答案 2 :(得分:2)
通常,您可以使用介于0和1之间的随机数生成器,并通过执行以下转换获得您想要的任何范围:
x' = r x + b
因此,如果您想要介于100,000和300,000之间的随机数,x
是0到1之间的随机数,那么您将r
设置为200,000和{{1} }为100,000,b
将在您想要的范围内。
答案 3 :(得分:1)
如果您还没有访问C ++内置函数,Boost在Boost.Random中有一堆真正的随机函数,包括specific solutions表示您明显的问题空间。
我赞同这些评论,澄清你的问题中的编辑将提高答案的准确性,例如。 “我需要从100,001到1,000,000的均匀分布的整数。”