博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
产生随机数字
阅读量:5958 次
发布时间:2019-06-19

本文共 5044 字,大约阅读时间需要 16 分钟。

1 #include 
2 #include
3 int main(void) 4 { 5 int i; 6 srand((unsigned) time(NULL)); //秒级的种子 7 printf("Ten random numbers from 0 to 99\n\n"); 8 for(i=0; i<10; i++) 9 printf("%d\n", rand() % 100);10 return 0;11 }

由于rand产生的随机数从0到rand_max,而rand_max是一个很大的数,那么如何产生从X~Y的数呢?

 从X到Y,有Y-X+1个数,所以要产生从X到Y的数,只需要这样写:     k=rand()%(Y-X+1)+X;

//用srand(unsigned int seed)来初始化随机数字

一般用系统的运行时间(毫秒级的)来设置seed
例如在windows下

#include 
srand(GetTickCount());int r=rand();

在C语言函数库中包含了一个产生随机数的函数:

int rand( void );
在函数库中对这个函数的说明是:

The rand function returns a pseudorandom integer in the range 

0 to RAND_MAX. Use the srand function to seed the pseudorandom

-number generator before calling rand.

而在C语言函数库中是这样定义RAND_MAX的:

/* Maximum value returned by "rand" function

*/
#define RAND_MAX 0x7FFF

所以,函数int rand( void );返回的是一个界于0~32767(0x7FFF)之

间的伪随机数,包括0和32767。注意,这里产生的是伪随机数,不是真正意

义上的随机数,看下面的程序:

#include "stdlib.h"#include "stdio.h"void main( void ){/* Display a number. */printf( " %6d\n", rand() );getchar();}

程序运行的结果是:

346

多次运行这个程序,发现每次产生的结果都是346(不同的机器可能产生

的结果不一样),这就是所谓的伪随机数。伪随机数是通过一个公式来运算

出来的,所以,每次产生的伪随机数都一样。那么,如何才能产生真正意义

上的随机数呢?这就有一个随机种子的问题。在C语言标准函数库中,有这

么一个函数:

void srand( unsigned int seed );

在《The c programming language》中对这个函数是这样描述的:

srand uses seed(函数变量声明中的seed) as the seed(随机函数中种子

的意思) for a new sequence of pseudo-random numbers. The 

initial seed is 1.

所以,要产生真正意义上的随机数,那么就要求每次提供的种子不一样,一

般情况下,都设置时间为随机函数的种子。看下面的一段程序:

1 /* RAND.C: This program seeds the random-number generator 2 * with the time, then displays 10 random integers. 3 */ 4 #include "stdlib.h" 5 #include "stdio.h" 6 #include "time.h" 7 void main( void ) 8 { 9 int i;10 /* Seed the random-number generator with current time so that11 the numbers will be different every time we run.12 将当前时间设置成随机函数的种子,所以每次产生的数都不一样13 */14 srand( (unsigned)time( NULL ) );15 /* Display 10 numbers. */16 for( i = 0; i < 10;i++ )17 printf( “ %6d\n”, rand() );18 }19 Output20 21 692922 802623 2198724 3073425 2058726 669927 2203428 2505129 798830 10104

每次运行这个程序,产生的随机数都不一样,这样就达到了随机数的要求了

注意,rand这个函数产生的随机数的范围是0~32767,如果要产生100以内

的随机数怎么办呢?在标准C语言库中并没有定义产生给定范围的随机数的

函数。其实,要产生给定范围的随机数,只要做一个取余(%)运算就可以了

。下面是一个产生10以内随机数的函数:

1 #include "stdlib.h" 2 #include "stdio.h" 3 #include "time.h" 4 int rand2( void ); 5 void main( void ) 6 { 7 int i; 8 /* Seed the random-number generator with current time so that 9 · the numbers will be different every time we run.10 */11 srand( (unsigned)time( NULL ) );12 /* Display 10 numbers:0~9 */13 for( i = 0; i < 10;i++ )14 printf( " %6d\n", rand2() );15 getchar();16 }17 int rand2( void )18 {19 return rand() % 10 ;20 }21 运行结果:22 223 5 24 725 926 027 128 329 5 30 831 3

在这个程序中,我自己写了一个函数rand2(),来产生10以内的随机数,其

实,打开标准库中的头文件 Stdlib.h 就会发现有这样的一条语句:

#define random(num) (rand() % (num))

上面的这行代码是为了方便产生给定范围的随机数的,思路也是采用取余的

方法,所以上面的程序也可以改成:

#include "stdlib.h"#include "stdio.h"

怎样让c语言中的随机函数真正随机? 

 

#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", random( 10 ) );getchar();}

 

另外,在头文件 Stdlib.h 中还可以发现下面的这条语句:

#define randomize() srand((unsigned)time(NULL))

所以,上面的程序也可以这样写:

1 #include "stdlib.h" 2 #include "stdio.h" 3 #include "time.h" 4 void main( void ) 5 { 6 int i; 7 /* Seed the random-number generator with current time so that 8 · the numbers will be different every time we run. 9 */10 randomize();11 /* Display 10 numbers. */12 for( i = 0; i < 10;i++ )13 printf( " %6d\n", random( 10 ) );14 getchar();15 }

下面的一个函数是对随机函数的模拟,设置不同的种子,产生不同的随机数

 

1 /* 模拟随机数的产生过程 2 */ 3 #include "stdlib.h" 4 #include "stdio.h" 5 #include "time.h" 6 int randx = 0; 7 void srand2( int a ); 8 int rand2( void ); 9 void main( void )10 {11 int i;12 int seed;13 /* 输入不同的种子就可以产生不同的随机数14 */15 printf( "Please input a seed: \n");16 scanf(" %d",&seed);17 srand2( seed );18 getchar();19 printf( " %d\n", rand2( ) );20 getchar();21 }22 void srand2( int a )23 {24 randx = a;25 }26 int rand2()27 {28 return (int)( randx * 123265187.7795 + 569412.1256 ) ;29 }30 输入:3 结果:2103931 输入:9 结果:-2713032 /* 模拟随机数的产生过程,以时间作为种子33 */34 #include "stdlib.h"35 #include "stdio.h"36 #include "time.h"37 int randx = 0;38 void srand2( int a );39 int rand2( void );40 void main( void )41 {42 int i;43 /* Seed the random-number generator with current time so that44 · the numbers will be different every time we run.45 */46 47 srand2( (unsigned)time( NULL ) );48 /* Display 10 numbers. */49 printf( " %6d\n", rand2( ) );50 getchar();51 }52 void srand2( int a )53 {54 randx = a;55 }56 int rand2()57 {58 return (int)( randx * 123265187.7795 + 569412.1256 ) ;59 }

每次运行上面的程序,产生的随机数都不一样。

总结:

1.函数rand()产生的是伪随机数,不是真正意义上的随机数,这个伪随机数
是根据一个公式算出来的,每次运行程序,产生的伪随机数都一样。
2.要产生真正意义上的随机数,要将函数srand( )和rand()配合使用,函数
srand()用来设置随机数的种子,一般以时间作为种子,当然也有其它
设置种子的方法。
3.设置随机数的种子,可以使用randomize(),它采用时间做为种子。
4.要产生给定范围的随机数,可以使用random()。 

 

 

 

转载自

 

转载于:https://www.cnblogs.com/Fightingbirds/archive/2012/12/02/2797886.html

你可能感兴趣的文章
JavaScript[19] -- 字符串
查看>>
javascript基础学习一(变量)
查看>>
【Nginx源码研究】Nginx中FastCGI浅析
查看>>
阿里推全球首家人工智能服饰店,随时“翻阅”50万淘宝红人穿搭锦囊
查看>>
如何将 emoji 当成单色 icon 使用
查看>>
PHP快速生成现代化form表单,就是好用
查看>>
由浅入深学习lodash的debounce函数
查看>>
An Intro to Git and GitHub
查看>>
Airbnb公司数据科学家教你如何在求职过程中找到心仪的工作
查看>>
新手入坑mpvue(没朋友)实战指南
查看>>
微信小程序组件开发规范
查看>>
15个必备的javascript小技巧,看的懂是入门,全会写就是大牛
查看>>
关于java集合框架的总结
查看>>
前端每日实战:7# 视频演示如何用纯 CSS 创作一个 3D 文字跑马灯特效
查看>>
前端构建工具 -- Webpack
查看>>
几种排序算法及 Python 实现
查看>>
java后端的学习之路(一) ------ mysql和jdbc&DBUtils
查看>>
(LeetCode-数组-2) 只出现一次的数字
查看>>
基于Nginx的中间件架构(三):Rewrite规则、secure_link和Geoip读取地域信息模块、HTTPS服务...
查看>>
CSS引入外部字体方法,附可用demo
查看>>