TA的每日心情 | 奋斗 2024-7-1 22:21 |
|---|
签到天数: 2014 天 [LV.Master]伴坛终老
- 自我介绍
- 数学中国站长
群组: 数学建模培训课堂1 群组: 数学中国美赛辅助报名 群组: Matlab讨论组 群组: 2013认证赛A题讨论群组 群组: 2013认证赛C题讨论群组 |
2#
发表于 2009-9-3 23:35
|只看该作者
|
|邮箱已经成功绑定
random和 rando多可以产生随机数,包含在stdlib.h里。
7 Z3 b9 i& ]% m8 q6 g/ R, s& r random函数不是ANSI C标准,不能在gcc,vc等编译器下编译通过。但在C语言中int random(num)可以这样使用,它返回的是0至num-1的一个随机数。 可改用C++下的rand函数来实现。
% u! ^2 y: E5 M6 b H, k. W6 V 1、C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX必须至少为32767。rand()函数不接受参数,默认以1为种子(即起始值)。随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。(但这样便于程序调试). z3 u5 n1 y- }1 ^: t* O: h) t2 ?
2、C++中另一函数srand(),可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪随机数列也相同。一个办法是让用户输入种子,但是仍然不理想。: o7 A; G; `+ n( r7 M! x
3、 比较理想的是用变化的数,比如时间来作为随机数生成器的种子。 time的值每时每刻都不同。所以种子不同,所以,产生的随机数也不同。; Y% t5 x! _- n, P# x. p7 U$ q! X; Z- S, B
rand运用问题与解答:
; Q6 m: A6 |" v" W 问:为什么有时rand()用它都是同一个数?如何产生一个真正随机数?
' X0 Z" @1 I* A) o1 ~; V# z 答:之所以rand()每次的随机数都一样是因为rand()函数使用不正确。各种编程语言返回的随机数(确切地说是伪随机数)实际上都是根据递推公式计算的一组数值,当序列足够长,这组数值近似满足均匀分布。如果计算伪随机序列的初始数值(称为种子)相同,则计算出来的伪随机序列就是完全相同的。这个特性被有的软件利用于加密和解密。加密时,可以用某个种子数生成一个伪随机序列并对数据进行处理;解密时,再利用种子数生成一个伪随机序列并对加密数据进行还原。这样,对于不知道种子数的人要想解密就需要多费些事了。当然,这种完全相同的序列对于你来说是非常糟糕的。要解决这个问题,需要在每次产生随机序列前,先指定不同的种子,这样计算出来的随机序列就不会完全相同了。你可以在调用rand()函数之前调用srand( (unsigned)time( NULL ) ),这样以time函数值(即当前时间)作为种子数,因为两次调用rand函数的时间通常是不同的,这样就可以保证随机性了。你也可以使用srand函数来人为指定种子数。Windows 9x/NT的游戏FreeCell就允许用户指定种子数,这样用户如果一次游戏没有成功,下次还可以以同样的发牌结果再玩一次。
% T, z! v" d% X0 ]6 h 例子:
% B' V& Y$ [3 R" l2 s# S9 `8 ]% G 以下为引用的内容:) ^8 n; n6 V( @5 ?) r0 [; @
#include <stdlib.h>& g6 R! j7 P5 n* S
#include <iostream.h>' T2 v; M4 S! L" a5 N
#include <conio.h>+ J" J& o+ R) n3 A5 `6 U( x5 j/ {/ i
#include <time.h>
& v, M4 k7 m8 x9 Y& B void main()6 S! i) K/ J/ C2 {3 ^2 F
{
9 l5 h; W( ^. a) O srand( (unsigned)time( NULL ) ); //注意不要放在for循环里,否则产生的数是同一个数。0 g6 a0 I: ~6 R7 F
for(int i=0;i<100000;i++), B0 n: H- \$ Z- v- u5 h" I0 d
{1 J) Q5 f4 Q" j( Z" r3 P* o; w
cout<<rand()<<endl;+ b3 h. @# D% Q, S6 \4 w1 t) c
}$ H6 D |6 M' F) c5 |6 W7 d
} |
|