先看一份产生真随机函数的代码
#include <stdio.h>
#include <stdlib.h>
// srand() 和 rand() 函数包含在此头文件中
#include <time.h>
// 由于要产生“真随机数列”,因此要用time()函数返回值来做“随机种子”
#define MAX 100000
int main ( ) {
int a;
freopen( "mytest.txt", "w", stdout ); // 把生成的数据写入文件mytest.txt,然后在解题的代码中加入freopen( "mytest.txt", "r", stdin ); ,使得代码从这个文本文件读取测试数据,代替手工从键盘输入数据。
srand( (unsigned)time( NULL ) );
int count = MAX; // 生成的元素的个数
// count = rand() % 10000; 生成一万以内的随机个元素
printf ( "%d\n", count );
// 下面的循环产生每个元素
for ( int i = 0; i< count; i++ ) {
a = rand() % 1000 ; // 此时 0 <= a < 1000,全部是正整数
if( a % 3 == 0 ) // 取三分之一的元素为负数,这个比例可以自己调整
printf( "%d " -a );
else
printf( "%d ", a );
}
printf( "%d\n", count ); // 非0元素的个数。
return 0;
}
看了上面随机数产生的实现过程,无非就是srand()和rand()函数。
其实随机函数rand()是一个可以生成随机数的函数随机数,函数返回的随机数在0-RAND_MAX(32767)之间;【来自百度提问】
rand()%100结果是随机数除以100后所得的余数,即限定随机的范围是在0~99之间;
需要注意的是rand()函数产生的所谓随机数是需要种子(理解为参考,有不同的参考才能产生不同的数)的,srand()正是提供初始化种子的函数,我们要真正的随机函数,就要确保种子每次都是不同的,那么我们把每时每刻都在变化的电脑时间作为种子的话,那么就能通过不断变化的种子来得到不同的函数。如何实现呢?->srand( (unsigned)time( NULL ) );
( 由于要产生“真随机数列”,因此要用time()函数返回值来做“随机种子”)
补充;
如果你要获得100以内的随机数,就对100求余,对10求余就是产生10以内的随机数,因为对一个数x求余后得到的数都是小于x的。
再贴一段百度提问的:
但如果对数有要求,如小数或在一定值以内:
小数:rand()/100.0 //100.0后面的.0必须写,得到一个小数点后有两位小数的小数。
一定范围内的数:rand()%m+n //m是数据区间差,n是最小值
如:求[ 100,120)之间的数就是:rand()%20+100
要产生0~100之间的 浮点型随机数:(rand()%1000)/10.0。