数学建模社区-数学中国

标题: 请大家帮忙看看这样取随机数可以吗 [打印本页]

作者: world_xin    时间: 2009-6-8 11:25
标题: 请大家帮忙看看这样取随机数可以吗
因为要同时抽取好多组的随机数,但又不希望用同一个种子文件. T$ A0 o5 v6 w% t
因此程序如下,请大家帮忙看看这样做有没有问题,多谢7 i" I1 ~( ~. S$ z" V
5 x) R' }" r# a4 I" N$ X
for (i=0;i<bin;i++)
1 H+ o, Z( x" y# S+ E# J   {
1 P! m8 J" Y; q0 z& N* [2 N    srand((int)time(0)+1000*i);
: E2 r/ b; i# {& t4 C& |   for (j=0;j<nn;j++)4 v3 |- h* b, t
   {  
: h/ F1 B$ k  c. J, R$ R0 N      x = (long double)rand()/RAND_MAX;
' k, w! @: P0 j1 a: f8 E, p      y = (long double)rand()/RAND_MAX*1.574212218771126;
9 m1 O, `  H. A3 ?  n* ~( h& R$ X5 F      if(y<profile(x))
. R1 S6 _, _. i' Q5 Q4 t1 V      fprintf(f,"%20.15Lf\n",(x+i)*period);3 ?, w' N- Q! x: @3 h9 N( c
   }1 f7 W% d- L( S7 C$ D
   }
作者: madio    时间: 2009-9-3 23:35
random和 rando多可以产生随机数,包含在stdlib.h里。0 ]% b) X- P7 B9 O% U# `
  random函数不是ANSI C标准,不能在gcc,vc等编译器下编译通过。但在C语言中int random(num)可以这样使用,它返回的是0至num-1的一个随机数。 可改用C++下的rand函数来实现。
4 V4 P" Y# ?  x, a9 V+ q  1、C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX必须至少为32767。rand()函数不接受参数,默认以1为种子(即起始值)。随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。(但这样便于程序调试)
2 ]2 }7 V( u( s4 U  ~  2、C++中另一函数srand(),可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪随机数列也相同。一个办法是让用户输入种子,但是仍然不理想。. Q- A4 n0 P& A, c* G. I7 {4 Y
  3、 比较理想的是用变化的数,比如时间来作为随机数生成器的种子。 time的值每时每刻都不同。所以种子不同,所以,产生的随机数也不同。) U; o' @  p3 U5 M" i1 C* `
  rand运用问题与解答:
5 i6 {/ l( d* e, K0 _* W  问:为什么有时rand()用它都是同一个数?如何产生一个真正随机数?
7 c% w4 I5 s8 j5 K( T9 I  答:之所以rand()每次的随机数都一样是因为rand()函数使用不正确。各种编程语言返回的随机数(确切地说是伪随机数)实际上都是根据递推公式计算的一组数值,当序列足够长,这组数值近似满足均匀分布。如果计算伪随机序列的初始数值(称为种子)相同,则计算出来的伪随机序列就是完全相同的。这个特性被有的软件利用于加密和解密。加密时,可以用某个种子数生成一个伪随机序列并对数据进行处理;解密时,再利用种子数生成一个伪随机序列并对加密数据进行还原。这样,对于不知道种子数的人要想解密就需要多费些事了。当然,这种完全相同的序列对于你来说是非常糟糕的。要解决这个问题,需要在每次产生随机序列前,先指定不同的种子,这样计算出来的随机序列就不会完全相同了。你可以在调用rand()函数之前调用srand( (unsigned)time( NULL ) ),这样以time函数值(即当前时间)作为种子数,因为两次调用rand函数的时间通常是不同的,这样就可以保证随机性了。你也可以使用srand函数来人为指定种子数。Windows 9x/NT的游戏FreeCell就允许用户指定种子数,这样用户如果一次游戏没有成功,下次还可以以同样的发牌结果再玩一次。
4 b+ _3 e" ~$ |" n. z  例子:7 r/ A2 [( B) G* w! u$ H- ?8 M6 y
  以下为引用的内容:+ v/ t9 N" j9 f$ b$ ^; H2 o2 d( X& c: z
  #include <stdlib.h>( L" h7 y. b3 I4 U3 I* |" ]
  #include <iostream.h>8 K+ R# @9 a6 w
  #include <conio.h>' L/ {" J: _& J: e" f, r8 B
  #include <time.h>
" b2 P  {) T8 c- i. R' W  void main()# {8 }; q. |$ I$ o  [
  {4 e' m! I5 t7 O% v; {4 ^
  srand( (unsigned)time( NULL ) ); //注意不要放在for循环里,否则产生的数是同一个数。8 J2 m3 S: g1 W5 d1 ?9 _
  for(int i=0;i<100000;i++)
4 T" c1 g. d7 B- C  {) U3 `3 J9 x6 P2 H
  cout<<rand()<<endl;) N* B; R" \) F7 L
  }
. }, B0 d3 h% m; f9 N7 T  }
作者: 李——建辉    时间: 2012-1-25 20:45
嘿嘿,声明一下:本人看贴和回贴的规则,好贴必看,精华贴必回。5610401069448530913717568348171722629215433605991616398430261146779477050245392




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5