【问题标题】:repeated random number [closed]重复的随机数[关闭]
【发布时间】:2011-10-02 11:49:59
【问题描述】:

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

【问题讨论】:

  • “它会生成所有不同的随机数”——你为什么这么认为?
  • 当你掷骰子 6 次时,你不会期望掷出 1、2、3、4、5、6 吧? (尽管有可能)。如果你掷骰子超过 6 次,骰子也不会显示错误:)
  • 不清楚你在说什么。坐下来,深呼吸,喝点咖啡,然后花一些时间来制定你的下一个评论/编辑。 在点击 Enter 之前确保它有意义。
  • 您似乎真的想要一个无序的唯一数字列表?因为这与生成(伪)随机数完全不同。
  • @jrok:掷骰子六次后,下一次掷骰子当然会例外 :-) OP:如果数字完全不同,它们就不会是均匀随机的,他们会不会-- 因为你已经知道下一个不会是哪个数字,这对于均匀随机数来说是不正确的。

标签: c++ random


【解决方案1】:

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

在这种情况下,您可以像这样首先生成数组:

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 之前为随机生成器播种,因为它会在内部生成随机数来进行 shuffle。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 2020-12-09
    相关资源
    最近更新 更多