【问题标题】:Random numbered array gives the same number [duplicate]随机编号的数组给出相同的数字[重复]
【发布时间】:2013-07-22 20:58:45
【问题描述】:

我正在尝试生成两个随机数数组。一个数组用于高度,另一个用于文本艺术鱼缸的宽度。但是数组总是有相同的重复数字。

例如:[ 2, 2, 2, 2 ] 或 [ 9, 9, 9]

我一定是错误地设置了循环,但我需要帮助看看出了什么问题。

    //Generate random numbers for fish positions in vector
    if ( fish_collection.size() != 0 )
    {
        int randHeight[fish_collection.size()];
        int randWidth[fish_collection.size()];

        for ( int i = 0; i < fish_collection.size(); i++ )
        {
            srand (time(NULL));
            randHeight[i] = rand() % 10 + 1;
            randWidth[i] = rand() % (tank_size - 5) + 1;
        }

        //random number printed test
        for ( int i = 0; i < fish_collection.size(); i++ )
        {
            cout << randWidth[i] << ',';
        }
        cout << endl;

        //Enter the fish in random position
        for ( int j = 0; j < fish_collection.size(); j++ )
        {
            tank_frame[randHeight[j]].replace ( randWidth[j], fish_collection[j].size(), fish_collection[j] );
        }
    }

【问题讨论】:

    标签: c++ arrays random


    【解决方案1】:

    你只需要在程序中调用一次srand(time(NULL))(通常在main的开头)。

    相信不止一次调用它会重置整个序列,这解释了为什么你每次总是得到相同的数字(第一个)。 (而且你总是得到相同的第一个的原因是,很可能这些电话非常接近,时间是一样的)。

    'time(NULL)' 返回自 1970 年 1 月 1 日 00:00 以来的秒数,这解释了为什么 'srand(time(NULL))' 总是播种到相同的值:它在不到一秒的时间内执行,所以time(NULL) 返回相同的值。 (见link

    【讨论】:

    • 这是正确的,或者至少如果不完全正确,那就是 srand 的效果 - 重置序列。不过我不太明白为什么,因为以后时间应该会有所不同……嗯……时间……
    • @EdwardBird 如果程序运行得相当快,标准微秒时间可能没有机会“打勾”。
    • 问题是 time() 以秒为单位返回自纪元以来的当前时间,因此很可能在相对较少的迭代中,您将获得相同的时间(因此相同“随机”种子)每次调用。
    • @hexafraction 我刚刚在这里检查过:cplusplus.com/reference/ctime/time_ttime(NULL) 返回一个 time_t 对象,它被实现为自 1970 年 1 月 1 日 00:00 以来的秒数。(它计算秒数,这解释了为什么)
    • 哦,我的错。就这么几秒钟。
    【解决方案2】:

    每次调用rand() 函数时都会调用srand()。这是不正确的:srand() 应该只在程序开头使用一次,因为您传递给它的值设置了进一步的rand() 值的整个序列。在此示例中,您始终使用相同的参数调用 srand()(因为时间更新不是很频繁),因此 rand() 序列始终相同,因此对 rand() 的调用始终返回相同的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      相关资源
      最近更新 更多