如何在C ++循环中生成不同的随机数字?
是否有可能产生不同的随机数,每次循环运行。 例如,我有:
for (int t=0;t<10;t++) { int random_x; srand ( time(NULL) ); random_x = rand() % 100; cout<<"\nRandom X = "<<random_x; }
但问题是,它每次都会产生相同的随机数。 每次循环运行时是否可以生成不同的随机数字?
有没有可能重置随机数初始化?
不要在循环中使用srand
,只能使用一次,例如在main()
的开始处。 而srand()
正是你重置这个。
你每次都得到相同的随机数,因为你正在循环里设置一个种子。 即使你使用time()
,它每秒只会改变一次,所以如果你的循环在一秒之内完成(这可能会),你会得到相同的种子值,每次和相同的初始随机数。
将srand()
调用srand()
循环外(在应用程序启动时只调用一次),您应该随机获得“随机”数字。
不要使用rand()
; 请使用新的C ++ 11工具(例如std::mt19937
, std::uniform_int_distribution
等)。
你可以使用这样的代码( 住在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; } }
PS
考虑从Going Native 2013大会上观看这个video,了解有关rand()
相关问题的更多细节:
兰特()被认为是有害的
尝试移动种子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在评论中所说的那样,如果循环没有驻留在你正在调用的函数中,移动循环外的种子只会有所帮助。
我有几天的同样的问题。 保持srand()离开循环是一个+。 另外,不要将rand()%100分配给任何variables。 只需在循环中输出rand()%100即可。 尝试这个:
srand (time(NULL)); (int t=0;t<10;t++) { cout << rand() % 100 << endl; }
每次停止发电机发电。 将srand呼叫从循环中拉出
将srand
调用移到程序的开头。 就像现在这样,连续两次调用的时间可能是一样的,所以随机数发生器将在同一个地方重新开始。
你需要从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; }
时间函数可能在循环的每次迭代期间返回相同的值。
尝试在循环之前初始化随机种子。
每次迭代都会重置伪随机数的序列,因为您使用相同的种子调用srand
(因为time
的调用非常频繁)。 要么使用不同的种子,要么在进入循环之前调用一次 srand
。
如果你在程序的早期就有了随机数,那么你可以在时间上乘以循环variables – 给出一个更好的分布。 例如
for (int t = 0; t < 10; t++){ srand(time(NULL)*t); random = rand() % GetScreenWidth(); }
/*this code is written in Turbo C++ For Visual Studio, code is in comment*/ int a[10],ct=0,x=10,y=10; //x,y can be any value, but within the range of //array declared randomize(); //there is no need to use this Visual Studio for(int i=0;i<10;i++) { a[i]=random(10); //use a[i]=rand()%10 for Visual Studio } cout<<"\n\n"; do { ct=0; for(i=0;i<x;i++) { for(int j=0;j<y;j++) { if(a[i]==a[j]&&i!=j) { a[j]=random(10); //use a[i]=rand()%10 for Visual Studio } else { ct++; } } } }while(!(ct==(x*y)));
那么我不是在C + +的专业人士,但在学校学到了。 我在过去的一年中使用这个algorithm来在一维数组中存储不同的随机值,但是在一些变化之后,这也将在二维数组中工作。 有关代码的任何build议,欢迎。
不认识男人 经过10分钟的testing,我find了最好的方法。 (更改代码中的数字以获取大或小的随机数。)
int x; srand ( time(NULL) ); x = rand() % 1000 * rand() % 10000 ; cout<<x;