如何在C ++循环中生成不同的随机数?

时间:2011-02-07 21:10:18

标签: c++ loops random

每次循环运行时是否可以生成不同的随机数。例如,我有:

for (int t=0;t<10;t++)
{
    int random_x;
    srand ( time(NULL) );
    random_x = rand() % 100;
    cout<<"\nRandom X = "<<random_x;
} 

但问题是,它每次都会生成相同的随机数。是否有可能在每次循环运行时生成不同的随机数?

是否有可能重置随机数初始化?

14 个答案:

答案 0 :(得分:25)

不要在循环中使用srand,只能使用一次,例如在main()的开头。 srand()正是您重置此内容的方式。

答案 1 :(得分:16)

每次都会得到相同的随机数,因为您在循环中设置种子。即使你正在使用time(),它每秒只会改变一次,所以如果你的循环在一秒内完成(很可能会),你每次都会获得相同的种子值,并且相同的初始随机值号。

srand()调用移出循环(并在应用开始时只调用一次),你应该得到随机的“随机”数字。

答案 2 :(得分:8)

使用rand();使用新的C ++ 11工具(例如 std::mt19937 std::uniform_int_distribution 等)。

您可以使用这样的代码(live here on Ideone):

#include <iostream>
#include <random>
using namespace std;

int main()
{
    // Random seed
    random_device rd;

    // Initialize Mersenne Twister pseudo-random number generator
    mt19937 gen(rd());

    // Generate pseudo-random numbers
    // uniformly distributed in range (1, 100)
    uniform_int_distribution<> dis(1, 100);

    // Generate ten pseudo-random numbers
    for (int i = 0; i < 10; i++)
    {
        int randomX = dis(gen);
        cout << "\nRandom X = " << randomX;
    }
}

<强> P.S。

考虑观看来自Going Native 2013会议的视频,了解有关rand()相关问题的更多详情:

  

rand() Considered Harmful

答案 3 :(得分:3)

尝试将种子srand移动到循环外部,如下所示:

srand ( time(NULL) );
for (int t=0;t<10;t++)
{
    int random_x;
    random_x = rand() % 100;
    cout<< "\nRandom X = "<<random_x;
} 

Mark Ransom在评论中说,如果循环没有驻留在你多次调用的函数中,那么将种子移到循环外只会有所帮助。

答案 4 :(得分:1)

我有几天同样的问题。保持srand()不在循环中是+。另外,不要将rand()%100赋给任何变量。只需在循环中cout rand()%100。试试这个:

    srand (time(NULL));
    (int t=0;t<10;t++)
    {
    cout << rand() % 100 << endl;
    } 

答案 5 :(得分:0)

每次停止播种发生器。 将srand调用拉出循环

答案 6 :(得分:0)

srand调用移至程序的开头。正如你现在所说的那样,两次连续呼叫之间的时间可能相同,因此随机数发生器将在同一地点重新开始。

答案 7 :(得分:0)

您需要从for循环中提取time()的初始化。

这是一个将在Windows控制台中输出预期(ahah)随机数的示例。

#include <iostream>
#include <windows.h>
#include "time.h"
int main(int argc, char*argv[])
{
    srand ( time(NULL) );
    for (int t = 0; t < 10; t++)
    {
        int random_x;

        random_x = rand() % 100;
        std::cout << "\nRandom X = " << random_x << std::endl;
    }
    Sleep(50000);
    return 0;
}

答案 8 :(得分:0)

时间函数可能在循环的每次迭代期间返回相同的值。

尝试在循环之前初始化随机种子。

答案 9 :(得分:0)

每次迭代都要重置伪随机数序列,因为您使用相同的种子调用srand(因为对time的调用非常频繁)。要么使用不同的种子,要么在进入循环之前调用srand 一次

答案 10 :(得分:0)

如果你在程序的早期有randoms,你可以将循环变量乘以时间 - 以提供更好的分布。例如

for (int t = 0; t < 10; t++){
        srand(time(NULL)*t);
        random =  rand() % GetScreenWidth();

}

答案 11 :(得分:0)

break

嗯,我不是C ++的专业人士,但在学校里学到了这一点。我使用这个算法过去1年在一维数组中存储不同的随机值,但是在一些更改之后这也将在2D数组中工作。 欢迎任何关于代码的建议。

答案 12 :(得分:0)

函数rand()的工作方式是每次调用它都会生成一个随机数。在您的代码中,您已经调用了它一次,并将其存储到变量random_x中。要获取所需的随机数而不是将其存储到变量中,只需调用如下函数:

for (int t=0;t<10;t++)
{
    cout << "\nRandom X = " << rand() % 100;
}

答案 13 :(得分:-1)

不认识男人。在测试了10分钟之后的不同方式后,我找到了最好的方法。  (更改代码中的数字以获得大或小的随机数。)

    int x;
srand ( time(NULL) );
x = rand() % 1000 * rand() % 10000 ;
cout<<x;