重复随机数

时间:2011-10-02 11:49:59

标签: c++ random

这只是好奇心的问题,我在想,以防万一我开始使用 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;
}

1 个答案:

答案 0 :(得分: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],....没有州,所以可以并且将会重复相同的数字。