2011-10-02 167 views
-2

这只是好奇心的问题,我在想,如果我在 开始时使用C++ rand()函数srand(time(0)),它会生成所有不同的随机数,所以我尝试过会发生什么,当给定数组的sizeof大得多时,例如给定两个整数范围内的元素数量,当数组被声明为int a [100]时,以及从[15 75]中随机数的范围时,我想知道代码应该给我错误像有更多的数字比范围或类似的东西,但它产生了随机重复值为什么?这里是代码重复的随机数

#include <iostream> 
#include <cstdlib> 
#include <time.h> 
using namespace std; 

int main(){ 
    int min=15; 
    int max=75; 
    int a[100]; 

    srand(time(0)); 
    for (int i=0;i<100;i++) { 
     a[i]=min+rand()%(max-min+1);  
    } 

    for (int i=0;i<100;i++) { 
     cout<<a[i]<< " "; 
    } 
    return 0; 
} 
+10

“它会产生所有不同的随机数” - 你为什么这么认为? – Howard

+0

我不明白你的问题。它是什么? –

+0

你能否明确告诉我们你会期望什么样的顺序?显然你做了一些错误的假设,但目前还不清楚。 – leftaroundabout

回答

3

这似乎是你真正想要的是一个唯一的数字,但随机顺序的列表?这与生成伪随机数完全不同。

在这种情况下,你可以先这样产生的数组:

std::vector<int> myNumbers; 
myNumbers.reserve(50); 
int i = 25; 
std::generate_n(back_inserter(myNumbers),50,[&i]() { return i++; }); 

然后将它洗像这样:

std::random_shuffle(myNumbers.begin(), myNumbers.end()); 

注意,大部分的时间,你应该之前种子的随机数发生器调用shuffle,因为它会在内部产生随机数字来进行洗牌。

在你的例子中,你只需要在25-75范围内用随机数填充一个数组(100个元素)。这肯定会给出重复的数字,甚至有一个(小)的机会,你总是会得到相同的数字,就像有一个机会,你可以用公平的骰子掷出'6'100次。你只需掷出一个(非常大的)骰子,将第一个结果放入插槽[0],再次掷出,放入[1],...。没有国家,所以相同的数字可以重复。