srand() 和 rand()

RAND_MAX 是 VC 中 stdlib.h 中宏定义的一个字符常量:
#define RAND_MAX 0x7FFF
其值为 32767
通常在产生随机小数时可以使用 RAND_MAX 。
我们要选取我们范围内的 随机数时可以使用一下方法。
1 、假设取值范围是 0-8 则 rand()%8
2 、对于浮点数如 0.1-0.8 则 rand()%8 × 0.1.
在 VC6 中, RAND_MAX 值是 0x7fff ,所以直接用是不行的
你可以这样使用 : a= (int)((double)rand() / RAND_MAX * N) ( N
为你期望的最大数) 若 N 为 100000 这样做 a 一直都是 5 位数,且上升
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void main( void )
{
int i,k;
srand( (unsigned)time( NULL ) ); // 用系统时间当种子 , 对随机函数进行初
始化
for( i = 0; i < 10;i++ )
{
k=rand()%100; // 产生各个随机数
printf( " k=%d\n", k );
}
}
详述
#include <stdlib.h>rand()
srand()
标准 C 库中函数 rand ()可以生成 0~RAND_MAX 之间的一个随机数,其中 RAND_M
AX 是 stdlib.h 中定义的一个整数,它与系统有关。
rand ()函数没有输入参数,直接通过表达式 rand ()来引用;例如可以用下面的
语句来打印两个随机数:
printf("Random numbers are: %i %i\n",rand(),rand());
因为 rand ()函数是按指定的顺序来产生整数,因此每次执行上面的语句都打印相
同的两个值,所以说 C 语言的随即并不是正真意义上的随机。
为了 使 程序在每次执行时都能生成一个新序列的随机值,我们通常通过为随机数生成
器提供一粒新的随机种子。函数 srand()( 来自 stdlib.h) 可以为随机数生成器播散种
子。只要种子不同 rand() 函数就会产生不同的随机数序列。 srand() 称为随机数生成器
的初始化器。
例程
文件名: rand_srand.c
/* This program generates and prints ten random integers betwee
n 1 and RAND_MAX*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned int seed; /* 申明初始化器的种子,注意 是 u n signed int 型的 * /
int k;
printf("Enter a positive integer seed value: \n");
scanf("%u",&seed);
srand(seed);
printf("Random Numbers are:\n");
for(k = 1; k <= 10; k++)
{
printf("%i",rand());
printf("\n");
}
return 0;
}
当提供的种子相同时 , 随机数序列也时相同的 。 而且当种子为 1 时 , 与不使用 srand
() 函数时一样的,也就是说 rand() 函数默认情况下初始化种子值为 1 ;在 stdlib.h 中这两个函数的原型是:
int rand();
void srand (unsigned int);
srand(time(0)); i=rand(); 这样 i 就是一个真正意义上的随机数。
原因
rand() 产生伪随机数, srand 函数提供种子,种子不同产生的随机数序列也不同,
所以通常先调用 srand 函数 time(0) 返回的是系统的时间(从 1970.1.1 午夜算起) ,
单位:秒,种子不同当然产生的随机数相同几率就很小了。
产生随机数的方法
1. 如何产生一定范围内的随机数?
产生 1~ N 的随机数 rand() % N +1 ;
直接的方法是:
rand() % N;
返回从 0 到 N - 1 的数字。但这个方法不好, 因为许多随机数发生器的低位比特并不随机 。
一个较好的方法是:
(int)((double)rand() / ((double)RAND_MAX + 1) * N);
如果你不希望使用 double ,另一个方法是:
rand() / (RAND_MAX / N + 1);
两种方法都需要知道 RAND_MAX , 而且假设 N 要远远小于 RAND_MAX 。 ANSI 规定标准头文件
stdlib.h 中包含 RAND_MAX 的 #define 。 顺便提一下 , RAND_MAX 是个常数 , 它告诉你 C
库函数 rand() 的固定范围。你不可以设 RAND_MAX 为其它的值,也没有办法要求 rand()
返回其它范围的值 。 如果你用的随机数发生器返回的是 0 到 1 的浮点值 , 要取得范围在 0 到 N
- 1 内的整数,只要将随机数乘以 N 就可以了。
2. 为什么每次执行程序, rand() 都返回相同顺序的数字?
你可以调用 srand() 来初始化伪随机数发生器的种子 , 传递给 srand() 的值应该是真正
的随机数,例如当前时间:#include <stdlib.h>
#include <time.h>
srand((unsigned int)time((time_t *)NULL));
请注意 , 在一个程序执行中多次调用 srand() 并不见得有帮助 ! 不要为了取得 “ 真随机数 ” 而在
每次调用 rand() 前都调用 srand() !
3. 我需要随机的真 / 假值 , 所以我用直接用 rand() % 2 , 可是我得到交替的 0, 1, 0, 1, 0 。
这是个低劣的伪随机数生成器,在低位比特中不随机!很不幸,某些系统就提供这样的伪随
机数生成器。请试着使用高位比特,具体请参考本文第 1 点。
4 产生 0 ~ 1 的随机数
rand()/(RAND_MAX+0.0)
5 产生 x ~ y 的随机数 (y>x)
rand()%(y-x+1)+xRAND_MAX 是 VC 中 stdlib.h 中宏定义的一个字符常量:
#define RAND_MAX 0x7FFF
其值为 32767
通常在产生随机小数时可以使用 RAND_MAX 。
我们要选取我们范围内的 随机数时可以使用一下方法。
1 、假设取值范围是 0-8 则 rand()%8
2 、对于浮点数如 0.1-0.8 则 rand()%8 × 0.1.
在 VC6 中, RAND_MAX 值是 0x7fff ,所以直接用是不行的
你可以这样使用 : a= (int)((double)rand() / RAND_MAX * N) ( N
为你期望的最大数) 若 N 为 100000 这样做 a 一直都是 5 位数,且上升
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void main( void )
{
int i,k;
srand( (unsigned)time( NULL ) ); // 用系统时间当种子 , 对随机函数进行初
始化
for( i = 0; i < 10;i++ )
{
k=rand()%100; // 产生各个随机数
printf( " k=%d\n", k );
}
}
详述
#include <stdlib.h>rand()
srand()
标准 C 库中函数 rand ()可以生成 0~RAND_MAX 之间的一个随机数,其中 RAND_M
AX 是 stdlib.h 中定义的一个整数,它与系统有关。
rand ()函数没有输入参数,直接通过表达式 rand ()来引用;例如可以用下面的
语句来打印两个随机数:
printf("Random numbers are: %i %i\n",rand(),rand());
因为 rand ()函数是按指定的顺序来产生整数,因此每次执行上面的语句都打印相
同的两个值,所以说 C 语言的随即并不是正真意义上的随机。
为了 使 程序在每次执行时都能生成一个新序列的随机值,我们通常通过为随机数生成
器提供一粒新的随机种子。函数 srand()( 来自 stdlib.h) 可以为随机数生成器播散种
子。只要种子不同 rand() 函数就会产生不同的随机数序列。 srand() 称为随机数生成器
的初始化器。
例程
文件名: rand_srand.c
/* This program generates and prints ten random integers betwee
n 1 and RAND_MAX*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned int seed; /* 申明初始化器的种子,注意 是 u n signed int 型的 * /
int k;
printf("Enter a positive integer seed value: \n");
scanf("%u",&seed);
srand(seed);
printf("Random Numbers are:\n");
for(k = 1; k <= 10; k++)
{
printf("%i",rand());
printf("\n");
}
return 0;
}
当提供的种子相同时 , 随机数序列也时相同的 。 而且当种子为 1 时 , 与不使用 srand
() 函数时一样的,也就是说 rand() 函数默认情况下初始化种子值为 1 ;在 stdlib.h 中这两个函数的原型是:
int rand();
void srand (unsigned int);
srand(time(0)); i=rand(); 这样 i 就是一个真正意义上的随机数。
原因
rand() 产生伪随机数, srand 函数提供种子,种子不同产生的随机数序列也不同,
所以通常先调用 srand 函数 time(0) 返回的是系统的时间(从 1970.1.1 午夜算起) ,
单位:秒,种子不同当然产生的随机数相同几率就很小了。
产生随机数的方法
1. 如何产生一定范围内的随机数?
产生 1~ N 的随机数 rand() % N +1 ;
直接的方法是:
rand() % N;
返回从 0 到 N - 1 的数字。但这个方法不好, 因为许多随机数发生器的低位比特并不随机 。
一个较好的方法是:
(int)((double)rand() / ((double)RAND_MAX + 1) * N);
如果你不希望使用 double ,另一个方法是:
rand() / (RAND_MAX / N + 1);
两种方法都需要知道 RAND_MAX , 而且假设 N 要远远小于 RAND_MAX 。 ANSI 规定标准头文件
stdlib.h 中包含 RAND_MAX 的 #define 。 顺便提一下 , RAND_MAX 是个常数 , 它告诉你 C
库函数 rand() 的固定范围。你不可以设 RAND_MAX 为其它的值,也没有办法要求 rand()
返回其它范围的值 。 如果你用的随机数发生器返回的是 0 到 1 的浮点值 , 要取得范围在 0 到 N
- 1 内的整数,只要将随机数乘以 N 就可以了。
2. 为什么每次执行程序, rand() 都返回相同顺序的数字?
你可以调用 srand() 来初始化伪随机数发生器的种子 , 传递给 srand() 的值应该是真正
的随机数,例如当前时间:#include <stdlib.h>
#include <time.h>
srand((unsigned int)time((time_t *)NULL));
请注意 , 在一个程序执行中多次调用 srand() 并不见得有帮助 ! 不要为了取得 “ 真随机数 ” 而在
每次调用 rand() 前都调用 srand() !
3. 我需要随机的真 / 假值 , 所以我用直接用 rand() % 2 , 可是我得到交替的 0, 1, 0, 1, 0 。
这是个低劣的伪随机数生成器,在低位比特中不随机!很不幸,某些系统就提供这样的伪随
机数生成器。请试着使用高位比特,具体请参考本文第 1 点。
4 产生 0 ~ 1 的随机数
rand()/(RAND_MAX+0.0)
5 产生 x ~ y 的随机数 (y>x)
rand()%(y-x+1)+x
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值