我一直想系统地学习c语言的伪随机数,今天终于抓住了机会
伪随机数
c语言具有可以生成随机数据的函数,需要添加stdlib.h和time.h头文件。 首先在主函数的开头加上srand(unsigned ) time (null ) )。
让我先介绍一下srand
头文件:
定义函数: void srand (未定义;
函数说明:用于设置srand (为rand )生成随机数时的随机数种子。 参数seed必须是整数,通常可以将getpid (或time(0) )返回值用作seed。 如果为每个seed设置相同的值,则rand ()生成的随机值每次都相同。
让我来介绍一下time,
函数名: time
函数原型:time_ttime(time_t*timer ) )。
函数功能:获取设备的日历时间或设置日历时间
函数返回:机器日历时间
参数说明:如果timer=null,则获得机器日历时间;如果timer=时间数值,则用于设置日历时间,time_t为长时间类型
所属文件:
因此,上述的srand (单一)时间(空) ) )利用系统时间初始化随机种子。
最后介绍一个重要的函数rand
随机函数
头文件:
定义函数:内部(void ) )
函数:生成随机数
函数说明:由于rand的内部实现是用线性同构方法制作的,它不是真的随机数,因为其周期特别长,可以看作在一定范围内的随机。 rand ) )返回从0到RAND_MAX范围内的随机值。 在调用此函数生成随机数之前,必须使用srand (设置随机数种子。 如果未设置随机数种子(rand ) )在调用时自动将随机数种子设置为1。
返回值:返回从0到RAND_MAX的随机整数值。 RAND_MAX的范围为32767(int ),为2个字节(16位)。 在unsigned int中,2字节为65535,4字节为4294967295的整数范围。 选择0-RAND_MAX中的每个数字的概率相同。
rand ) )生成假随机数字,每次运行时都相同。 如果不同,用不同的值初始化。 初始化的函数是srand (。
举一个例子
#包含
#包含
#包含
int main () )。
srand () unsigned (time ) ) null );
for(intI=0; i10; I ) {
printf('%d ',rand ) );
}
返回0;
}
说白了,上述随机数范围在0 ̄0~32767之间,如果没有设置系统时间种子,rand的默认随机种子为1,多次运行结果一致。
当然,如果想要给定范围的随机数,则必须使用rand (() ) ) ) b-a ) a。 很明显,rand () % ) b-a] )的范围为[0,b-a],再加上a就是[a,b]。
举个例子,[ 0,1 ]和[ 3,6 ]之间的随机数)
#包含
#包含
#包含
int main () )。
srand () unsigned (time ) ) null );
for(intI=0; i10; I ) {
printf('%d”,rand ) %2;
}
putchar((n ) );
for(intI=0; i10; I ) {
printf('%d”,rand ) %4);
}
返回0;
}
通常,该范围最大为0到32767,如果希望生成大于32767的随机数,可以通过移位、拼凑或用随机数除以RAND_MAX来获得[ 0,1 ]范围内的浮点数。 这个浮点数乘以范围的长度(b-a 1)再加上a就可以了。 即((int ) ) (double ) rand )/32767 * (B- a1 ) a ) )相当于该浮点数在[a,b]范围内的比例位置
举一个例子
#包含
#包含
#包含
int main () )。
srand () unsigned (time ) ) null );
for(intI=0; i10; I ) {
printf('%d ),) int ) ) 1.0*rand )/RAND_MAX*50000 10000 ) )//10000至60000
}
返回0;
}
PS:介绍了一种简单的交流技巧,一次计算出程序中所有需要的结果,并通过查询直接得到这些结果。 典型的交流技巧是木有(() )。
总结
c语言的伪随机数的适用范围还很广,下次需要使用的时候,就不用再找任何资料了。