zoukankan      html  css  js  c++  java
  • 产生随机数字

     1 #include <stdlib.h>
     2 #include <stdio.h>
     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 <windows.h>
    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 that
    11 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 Output
    20 
    21 6929
    22 8026
    23 21987
    24 30734
    25 20587
    26 6699
    27 22034
    28 25051
    29 7988
    30 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 2
    23 5 
    24 7
    25 9
    26 0
    27 1
    28 3
    29 5 
    30 8
    31 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 结果:21039
    31 输入:9 结果:-27130
    32 /* 模拟随机数的产生过程,以时间作为种子
    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 that
    44 · 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()。 

    转载自http://blog.sina.com.cn/s/blog_56ee22190100097v.html

  • 相关阅读:
    erlang调试技术之etop
    erlang进程与操作系统线程
    BFS算法入门--POJ3984
    Linux学习笔记(2)Linux学习注意事项
    Linux学习笔记(1)Linux虚拟机安装过程中的知识点及常用管理工具
    题解 UVA10587 【Mayor's posters】
    【BZOJ4590】自动刷题机
    【Usaco2006Mar】Milk Team Select产奶比赛
    【区间DP】释放囚犯
    ssm项目中KindEditor的图片上传插件,浏览器兼容性问题
  • 原文地址:https://www.cnblogs.com/Fightingbirds/p/2797886.html
Copyright © 2011-2022 走看看