BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #25990同步于 2009/7/8
CPP机器人发帖

[合集] 【请教】随机数的产生

shenlei
2009/7/8镜像同步0 回复
☆─────────────────────────────────────☆ dingzn041714 (dingzn041714) 于 (Mon Jul 28 09:39:09 2008) 提到: #include <iostream> #include "stdlib.h" #include "time.h" using namespace std; int getrand(){ srand(time(NULL)); return rand()%1000+1; } void main(){ int t; cout<<"随机产生的20个数显示如下:"<<endl; for(int i=0;i<20;i++){ t=getrand(); cout<<t<<endl; } } 产生的20个数都是一样的,为什么? 把srand()函数放到main()中产生的随机数则不一样,为什么? 谢谢:) ☆─────────────────────────────────────☆ windam (棒棒糖) 于 (Mon Jul 28 10:17:49 2008) 提到: srand是置一个随机数种子,计算机产生随机数是通过一种算法模拟出随机数的效果的,通过srand设置一个初始值,然后一直迭代下去,使这个函数出现循环结果的可能性尽可能长,因此srand调用一次就行了。 msdn里应该说的很明白了~ Sets a random starting point. void srand( unsigned int seed ); Parameters seed Seed for random-number generation Example /* RAND.C: This program seeds the random-number generator * with the time, then displays 10 random integers. */ #include <stdlib.h> #include <stdio.h> #include <time.h> void main( void ) { int i; /* Seed the random-number generator with current time so that * the numbers will be different every time we run. */ srand( (unsigned)time( NULL ) ); /* Display 10 numbers. */ for( i = 0; i < 10;i++ ) printf( " %6d\n", rand() ); } Output 6929 8026 21987 30734 20587 6699 22034 25051 7988 10104 ☆─────────────────────────────────────☆ nplus (nPlus) 于 (Mon Jul 28 10:47:21 2008) 提到: 如果要产生不同的数有这样一个解决方案(我自己以前临时想的,效率不一定高) unsigned func_randAccSeed(void) { static unsigned var_randASSeed=unsigned(time(NULL));//initialize the seed; for(int i=1;i<=3;i++) { unsigned var_randASConf=rand();//confusing varible; srand(var_randASConf); var_randASSeed+=var_randASConf; }; return var_randASSeed; }; int func_randMain(str_glbRegulate vars_randMain,int debug) { vars_randMain=func_glbRegulate(vars_randMain); srand(func_randAccSeed());//getting new seed; unsigned var_randMainRandom=rand();//initialize the random value; /*For Debug mode*/ { if(debug==1) { cout<<"\nDebug"<<'\n'<<"Unregulated:"<<var_randMainRandom<<' '<<"Proportion:"<<double(var_randMainRandom)/32767.0<<' '<<"Residue:"<<double(var_randMainRandom)/32767.0*double(vars_randMain.var_glbMax-vars_randMain.var_glbMin)<<"\nMax:"<<vars_randMain.var_glbMax<<" Min:"<<vars_randMain.var_glbMin; }; } /*moderate and regulate the random*/ { var_randMainRandom=int(double(var_randMainRandom)/32767.0*double(vars_randMain.var_glbMax-vars_randMain.var_glbMin)+double(vars_randMain.var_glbMin)); } /*For Debug mode*/ { if(debug==1) { cout<<"Regulated:"<<var_randMainRandom<<'\n'; }; } return var_randMainRandom; }; 简单的说 就是将产生的随机数的线性变化作为新的种子应该不难实现 ☆─────────────────────────────────────☆ nplus (nPlus) 于 (Mon Jul 28 11:24:46 2008) 提到: 简单地说 c和c++的伪随机数函数就是把种子这个数做各种代数变化最后生成的一个新的数 因为机器不能凭空捏造出一个数 所以只要种子有变 产生的就有变化 而产生的伪随机数序列的变化规律是一样的 这也就解释了为什么不会变化 ☆─────────────────────────────────────☆ Aimar (Aimar) 于 (Tue Jul 29 19:13:47 2008) 提到: 其实只要在最外层循环的外面写srand函数就可以了
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。