QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3844|回复: 2
打印 上一主题 下一主题

请大家帮忙看看这样取随机数可以吗

[复制链接]
字体大小: 正常 放大
world_xin        

7

主题

5

听众

457

积分

升级  52.33%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2009-6-8 11:25 |只看该作者 |正序浏览
|招呼Ta 关注Ta
因为要同时抽取好多组的随机数,但又不希望用同一个种子文件. b$ ^/ U  b' \) A2 ~, `, d  K3 j5 e( A
因此程序如下,请大家帮忙看看这样做有没有问题,多谢! `- Z7 b7 j4 E* X7 e$ D5 Y: |
0 t3 q; ~* }3 y. O* \0 a& a9 Z- @, i
for (i=0;i<bin;i++)- A4 F* Z! t7 u; Y7 _
   {
0 R  H. [7 w" u% z+ @3 Z) v  ~    srand((int)time(0)+1000*i);* ]: i! E, t1 w1 L- X1 C# N
   for (j=0;j<nn;j++)0 T+ O" K4 p9 `& j. g% ?0 S) x' c
   {  + k5 |' P2 B. l  v& t
      x = (long double)rand()/RAND_MAX;
1 |! V, j4 ]: r      y = (long double)rand()/RAND_MAX*1.574212218771126;
  i' Z2 B! L5 }* H/ S# u0 T      if(y<profile(x))
" Z3 |+ Y' D& v8 |      fprintf(f,"%20.15Lf\n",(x+i)*period);
( ]* a; g  f4 F' h4 \   }
( }. F6 P, _6 d   }
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

11

主题

6

听众

2308

积分

升级  10.27%

  • TA的每日心情
    慵懒
    2015-6-9 22:13
  • 签到天数: 155 天

    [LV.7]常住居民III

    社区QQ达人 邮箱绑定达人 发帖功臣

    群组2012第三期美赛培训

    群组学术交流A

    群组学术交流B

    嘿嘿,声明一下:本人看贴和回贴的规则,好贴必看,精华贴必回。5610401069448530913717568348171722629215433605991616398430261146779477050245392
    哈哈
    回复

    使用道具 举报

    madio        

    3万

    主题

    1312

    听众

    5万

    积分

  • TA的每日心情
    奋斗
    2024-7-1 22:21
  • 签到天数: 2014 天

    [LV.Master]伴坛终老

    自我介绍
    数学中国站长

    社区QQ达人 邮箱绑定达人 优秀斑竹奖 发帖功臣 风雨历程奖 新人进步奖 最具活力勋章

    群组数学建模培训课堂1

    群组数学中国美赛辅助报名

    群组Matlab讨论组

    群组2013认证赛A题讨论群组

    群组2013认证赛C题讨论群组

    random和 rando多可以产生随机数,包含在stdlib.h里。4 `1 ~% o4 ?/ t) o3 H+ z4 V) J# o. ]
      random函数不是ANSI C标准,不能在gcc,vc等编译器下编译通过。但在C语言中int random(num)可以这样使用,它返回的是0至num-1的一个随机数。 可改用C++下的rand函数来实现。8 l8 ?. j7 h* G$ b7 v
      1、C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX必须至少为32767。rand()函数不接受参数,默认以1为种子(即起始值)。随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。(但这样便于程序调试)
    6 \3 [) |' b' q- N9 O# ?( R+ V  2、C++中另一函数srand(),可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪随机数列也相同。一个办法是让用户输入种子,但是仍然不理想。! W3 y" X2 t  w( Z
      3、 比较理想的是用变化的数,比如时间来作为随机数生成器的种子。 time的值每时每刻都不同。所以种子不同,所以,产生的随机数也不同。
    2 w: S" @& `2 c; p$ C1 N  rand运用问题与解答:
    - q* u5 G5 g: B6 }  T  问:为什么有时rand()用它都是同一个数?如何产生一个真正随机数?
    ; E; g7 q  ]4 F: ]: B  答:之所以rand()每次的随机数都一样是因为rand()函数使用不正确。各种编程语言返回的随机数(确切地说是伪随机数)实际上都是根据递推公式计算的一组数值,当序列足够长,这组数值近似满足均匀分布。如果计算伪随机序列的初始数值(称为种子)相同,则计算出来的伪随机序列就是完全相同的。这个特性被有的软件利用于加密和解密。加密时,可以用某个种子数生成一个伪随机序列并对数据进行处理;解密时,再利用种子数生成一个伪随机序列并对加密数据进行还原。这样,对于不知道种子数的人要想解密就需要多费些事了。当然,这种完全相同的序列对于你来说是非常糟糕的。要解决这个问题,需要在每次产生随机序列前,先指定不同的种子,这样计算出来的随机序列就不会完全相同了。你可以在调用rand()函数之前调用srand( (unsigned)time( NULL ) ),这样以time函数值(即当前时间)作为种子数,因为两次调用rand函数的时间通常是不同的,这样就可以保证随机性了。你也可以使用srand函数来人为指定种子数。Windows 9x/NT的游戏FreeCell就允许用户指定种子数,这样用户如果一次游戏没有成功,下次还可以以同样的发牌结果再玩一次。* M  U0 A( R9 M) V6 r
      例子:  }0 ?: T/ y$ K2 t0 k1 _; ~4 J
      以下为引用的内容:
    6 `# F& F! O1 ~, a* m2 K. g  #include <stdlib.h>2 p+ g$ {6 `% J: k3 \' I6 i" O
      #include <iostream.h>1 b6 ]# f6 I% w
      #include <conio.h>7 g' a1 k( L% }
      #include <time.h>" x. o3 }* _. a8 v9 T5 P% p0 Z
      void main()
    " q! z3 r% F; ^( d$ N' }  {1 o1 v8 p6 w1 M  Y  n# J
      srand( (unsigned)time( NULL ) ); //注意不要放在for循环里,否则产生的数是同一个数。3 k* v) s1 P4 c8 h" i( f
      for(int i=0;i<100000;i++)5 G  V: F# ^* \6 \* E
      {
    ! V/ J5 h! g5 n$ A6 R  cout<<rand()<<endl;
    , J8 o- D1 F$ @: L' Q+ W  }
    8 [+ S  |5 K2 v0 J  }
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-1-1 15:35 , Processed in 0.779168 second(s), 64 queries .

    回顶部