C++生成随机数.doc_第1页
C++生成随机数.doc_第2页
C++生成随机数.doc_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

随机数随机数; x4 W; S9 ?M& t一、C+中不能使用random()函数9 A7 r! A A$ 9 J m Z! d random函数不是ANSI C标准,不能在gcc,vc等编译器下编译通过。但在C语言中int random(num)可以这样使用,它返回的是0至num-1的一个随机数。 可改用C+下的rand函数来实现。4 l- 9 c( c$ I4 Fr$ z5 3 O& T 1、C+标准函数库提供一随机数生成器rand,返回0RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX必须至少为32767。rand()函数不接受参数,默认以1为种子(即起始值)。 随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。(但这样便于程序调试) / l9 W7 E_: G1 b 2、C+中另一函数srand(),可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪随机数列也相同。一个办法是让用户输入种子,但是仍然不理想。 6 z+ f: j9 v M 3、 比较理想的是用变化的数,比如时间来作为随机数生成器的种子。 time的值每时每刻都不同。所以种子不同,所以,产生的随机数也不同。 1 d R1 q, 3 c2 G# / C+随机函数(VC program) ( ( K6 C! w/ C1 d b#include 0 M, ( x: Z& / m9 c9 d& N. w#include k8 2 p- v0 o- % K( u; D#include r& o; A! 0 T, D( u5 using namespace std; 1 J! v _ s) h. H7 i#define MAX 100 2 w; D+ H+ K Aint main(int argc, char* argv) d D) 6 Y6 h E, y 1 & U% q6 v+ D srand( (unsigned)time( NULL ) );/srand()函数产生一个以当前时间开始的随机种子.应该放在for等循环语句前面 不然要很长时间等待! |9 I; d/ ?7 ) 2 Rfor (int i=0;i10;i+) . C: E- I7 n _% _9 * Fcoutrand()%MAXendl;/MAX为最大值,其随机域为0MAX-11 ?. S% A* i4 y return 0; 6 D+ E w. az, B 5 a- A6 P3 _) r1 |! R( s二、rand()的用法 - : x W8 N) R! I, f rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数。 7 k$ u4 O0 ( yz# a/* maximum value returned by rand function S- s + Z& i5 r3 T*/ 9 u8 T- b6 z0 E: R#define RAND_MAX 0x7fffu x, F2 b* E+ p9 x# m2 C& H8 A! Y* Y2 ! , A# 这个是bcc55中的定义,说明这个整数的最大数是0x7fffu,u代表unicode编码。8 F; R! k1 s0 m/ M3 j. f# J$ x, i这样,如果你要产生010的10个整数,可以表达为: : W8 O+ F( / qint N = rand() % 11; 3 J9 t( k! F, w/ K 这样,N的值就是一个010的随机数,如果要产生110,则是这样: # k& P* m, y$ s. U 3 Kint N = 1 + rand() % 11; ! K5 l# ; I4 m8 a. N- P8 B总结来说,可以表示为: ; k( M3 . S& K4 ta + rand() % n3 Q9 v1 C2 h- e% 其中的a是起始值,n是整数的范围。 ( e& d/ P( j$ ha + rand() % (b-a+1) 就表示之间的一个随机数# R, 3 S$ u7 A# 7 k* f3 k+ d若要01的小数,则可以先取得010的整数,然后均除以10即可得到随机到十分位的10个随机小数,若要得到随机到百分位的随机小数,则需要先得到0100的10个整数,然后均除以100,其它情况依$ p4 s6 L8 Zc8 s# b此类推。 # w9 f% S) H# ?& Q 通常rand()产生的随机数在每次运行的时候都是与上一次相同的,这是有意这样设计的,是为了便于程序的调试。若要产生每次不同的随机数,可以使用srand( seed )函数进行随机化,随着seed的不同,就能够产生不同的随机数。 n5 W L$ P+ R Tq% V9 ?, r 如大家所说,还可以包含time.h头文件,然后使用srand(time(0)来使用当前时间使随机数发生器随机化,这样就可以保证每两次运行时可以得到不同的随机数序列(只要两次运行的间隔超过1秒)。 ! h* e* L, y+ m5 & zC语言中随机函数应用 / _( f# |& J4 x( j. TG! R可能大家都知道C语言中的随机函数random,可是random函数并不是ANSI C标准,所以说,random函数不能在gcc,vc等编译器下编译通过。那么怎么实现C语言中的随机函数呢? 8 y F, + w% j( X. H6 U除了random函数,还有一个rand函数,也是一个随机函数,可以产生从0到rand_max的随机数。 / j1 P9 T- W& i1 n/ #include - y; B) b5 L7 J$ s8 O0 #include e9 r( O0 f3 O/ a6 C0 Tfint main() / ?# H( Q5 Y; g4 U+ z9 f2 M 8 f5 Q- D- J0 S: f: F) * cint k; 9 P0 V4 T3 V) P; ?( o( q5 k=rand(); : F, QW T+ |9 L Eprintf(%dn, k); & m+ o% C- a* ?3 Y6 w: n. Zreturn 0; 6 * |7 _0 ! l+ 4 n! W( 9 s1 k f- Y6 A大家可以把以上的代码编译运行一下,发现他的确产生随机数了,但是你会发现,每次运行程序产生的随机数都是一样的,为什么呢?因为随机数取在C语言中采用的是固定序列,所以每次执行所取的是同一个数。 6 k 3 s$ J* O A那么如何写一个程序,让它每次运行时产生的随机数都不一样呢? 请看下面的例子: % e. D$ a u7 v% o X5 G: S#include * C+ h O3 GJ+ e#include 0 m8 p1 A & #include , i3 V; C3 - : L% gint main(void) # d8 X# r* v9 3 c0 l( 0 s8 F5 I! s 0 P9 4 r% q4 N P8 mR, pint i; # # H5 k3 9 M3 r2 t. Wtime_t t; 9 p# u K% G0 h8 F: u3 p D, fsrand(unsigned) time(&t); 3 c8 v8 z! i, K6 Wprintf(Ten random numbers from 0 to 99nn); 1 p0 & B b+ Z* S% ) ?for (i=0; i10; i+) / Y# M% Hl. # q# U& Jprintf(%dn, rand()%100); 6 h2 u1 I n3 J( T( Breturn 0; % & a, n+ I% % w7 D . p+ ( y m2 S2 w( c这时运行程序,会发现每次产生的随机数都不一样。 & B1 C) r& J1 K那么为什么第一个程序一样而第二个程序不一样呢? $ i* U i% i( l* l/ ?* C8 i3 第二个程序用到了一个新的函数srand,这个函数是给随机数产生一个随机种子(seed),函数原型是srand( (unsigned) time(NULL); ( X9 % k1 U% F Etime的值每时每刻都不同。所以种子不同,所以,产生的随机数也不同。 : G: E& j5 P. 6 x9 G; p1 i所以说,要想产生不同的随机数,在使用rand之前需要先调用srand 3 I# J; _* O) x f#

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论