linux c 随机函数 rand srand 介绍

一、在使用rand()产生随机数时,产生的是0~RAND_MAX(该值与平台有关,至少为32767,我下面测试的平台是0x7fffffff),之间的随机数,但其产生的随机数时伪随机数,默认随机数种子为1,所以每次重新运行程序,都会产生相同的随机数,如果要是每次运行时产生的随机数不同,可以以当前时间time(0)作为随机数种子。

二、srand(seed)函数用于给rand()函数设定种子。

三、time是C语言获取当前系统时间的函数,以秒作单位,代表当前时间自Unix标准时间戳(1970年1月1日0点0分0秒,GMT)经过了多少秒。

四、time(0)产生的时间的单位是秒,所以如果在要在一秒内产生多个随机数,那么就不应该用time(0)作为种子,time(0)一般只用于重新运行时要产生不同随机数的情况,否则在这一秒内产生的随机数将会是一样的。如下:

测试代码:


  
  
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4. void main( void )
  5. {
  6. int i = RAND_MAX;
  7. printf( "RAND_MAX=0x%x time(0)=%d \n", RAND_MAX, ( int)time( 0));
  8. /* 输出 10 个随机数. */
  9. for (i = 0; i < 10; i++)
  10. {
  11. srand(time( 0));
  12. printf( "%6d ", rand());
  13. }
  14. printf( "\n");
  15. }

五、如果在此之前没有调用过srand(seed),它会自动调用srand(1)一次,而且你会发现每次重新运行都将输出同样的值。

测试代码:


  
  
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4. void main( void )
  5. {
  6. int i = RAND_MAX;
  7. printf( "RAND_MAX=0x%x time(0)=%d \n", RAND_MAX, ( int)time( 0));
  8. /* 输出 10 个随机数. */
  9. for (i = 0; i < 10; i++)
  10. {
  11. printf( "%6d ", rand());
  12. }
  13. printf( "\n");
  14. }

六、srand(seed)用于给rand()函数设定种子,因为时间的流逝,种子会有变化,得到的随机值也就不一样了。

测试代码


  
  
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4. void main( void )
  5. {
  6. int i = RAND_MAX;
  7. printf( "RAND_MAX=0x%x time(0)=%d \n", RAND_MAX, ( int)time( 0));
  8. srand(( int)time( NULL));
  9. /* 输出 10 个随机数. */
  10. for (i = 0; i < 10; i++)
  11. {
  12. printf( "%6d ", rand());
  13. }
  14. printf( "\n");
  15. }

七、取得[a,b)之间的随机整数,使用(rand() % (b-a))+ a (结果值将含a不含b)。取得取得[a,b]之间的随机整数,使用(rand() % (b-a+1))+ a (结果值将含a含b).

测试代码


  
  
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4. #define random_1(a, b) ((rand() % (b - a)) + a)
  5. #define random_2(a, b) ((rand() % (b - a + 1)) + a)
  6. void main( void )
  7. {
  8. int i = RAND_MAX;
  9. printf( "RAND_MAX=0x%x time(0)=%d \n", RAND_MAX, ( int)time( 0));
  10. srand(( int)time( NULL));
  11. /* 输出 10 个随机数. */
  12. printf( "[0,100): ");
  13. for (i = 0; i < 10; i++)
  14. {
  15. printf( "%6d ", random_1( 0, 100));
  16. }
  17. printf( "\n");
  18. printf( "[0,100]: ");
  19. for (i = 0; i < 10; i++)
  20. {
  21. printf( "%6d ", random_2( 0, 100));
  22. }
  23. printf( "\n");
  24. }

八、用rand() / double(RAND_MAX)可以取得0~1之间的浮点数。

测试代码


  
  
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4. void main( void )
  5. {
  6. int i = RAND_MAX;
  7. double ran_float = 0.0;
  8. printf( "RAND_MAX=0x%x time(0)=%d \n", RAND_MAX, ( int)time( 0));
  9. srand(( int)time( NULL));
  10. /* 输出 10 个随机数. */
  11. for (i = 0; i < 10; i++)
  12. {
  13. ran_float = rand() / ( double)(RAND_MAX);
  14. printf( "%6f ", ran_float );
  15. }
  16. printf( "\n");
  17. }

发布了35 篇原创文章 · 获赞 1 · 访问量 1870

一、在使用rand()产生随机数时,产生的是0~RAND_MAX(该值与平台有关,至少为32767,我下面测试的平台是0x7fffffff),之间的随机数,但其产生的随机数时伪随机数,默认随机数种子为1,所以每次重新运行程序,都会产生相同的随机数,如果要是每次运行时产生的随机数不同,可以以当前时间time(0)作为随机数种子。

猜你喜欢

转载自blog.csdn.net/lzj_linux188/article/details/105195606