随机函数 rand,srand,random,srandom 的区别与使用
2016-03-07 17:36
393 查看
函数定义:
int rand(void); 返回 0 ------- RAND_MAX 之间的一个 int 类型整数,该函数为非线程安全函数。并且生成随机数的性能不是很好,已经不推荐使用。
void srand(unsigned int seed); 设置种子值,一般与“当前时间 + 进程ID”作为种子,如果没用调用该函数,则通过rand返回的默认种子值为1。
实现类似如下 :
[cpp] view
plain copy
<span style="font-size:16px;">
static unsigned long next = 1;
void my_srand(unsigned seed) {
next = seed;
}
/* RAND_MAX assumed to be 32767 */
int my_rand(void) {
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}</span>
官方推荐使用的函数为 :
long int random(void);
返回 0 ------- RAND_MAX 之间的一个 long 类型整数,该函数会产生一个非常大的随机值,最大为 16*((2**31)-1)。
random 函数使用非线性反馈随机数发生器生成默认大小为31个长整数表所返回的连续伪随机数。
void srandom(unsigned int seed);
设置种子值,一般与“当前时间 + 进程ID”作为种子,如果没用调用该函数,则通过random返回的默认种子值为1。
使用方法 :
假如你想产生 1 ------10 之间的一个随机数, 你应该像下面这样编码
j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));
而不是下面这样的代码
j = 1 + (rand() % 10);
结论:
如果你使用 srandom 种植种子, 则你应该使用 random 返回随机数, 如果你使用 srand 种植种子, 则你应该使用rand返回随机数。
不过srand和rand官方已经不推荐使用。原因是产生随机数的性能不是很好, 另外是随机数的随机性没有random好, 再者就是不是线程安全。
int rand(void); 返回 0 ------- RAND_MAX 之间的一个 int 类型整数,该函数为非线程安全函数。并且生成随机数的性能不是很好,已经不推荐使用。
void srand(unsigned int seed); 设置种子值,一般与“当前时间 + 进程ID”作为种子,如果没用调用该函数,则通过rand返回的默认种子值为1。
实现类似如下 :
[cpp] view
plain copy
<span style="font-size:16px;">
static unsigned long next = 1;
void my_srand(unsigned seed) {
next = seed;
}
/* RAND_MAX assumed to be 32767 */
int my_rand(void) {
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}</span>
官方推荐使用的函数为 :
long int random(void);
返回 0 ------- RAND_MAX 之间的一个 long 类型整数,该函数会产生一个非常大的随机值,最大为 16*((2**31)-1)。
random 函数使用非线性反馈随机数发生器生成默认大小为31个长整数表所返回的连续伪随机数。
void srandom(unsigned int seed);
设置种子值,一般与“当前时间 + 进程ID”作为种子,如果没用调用该函数,则通过random返回的默认种子值为1。
使用方法 :
假如你想产生 1 ------10 之间的一个随机数, 你应该像下面这样编码
j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));
而不是下面这样的代码
j = 1 + (rand() % 10);
结论:
如果你使用 srandom 种植种子, 则你应该使用 random 返回随机数, 如果你使用 srand 种植种子, 则你应该使用rand返回随机数。
不过srand和rand官方已经不推荐使用。原因是产生随机数的性能不是很好, 另外是随机数的随机性没有random好, 再者就是不是线程安全。
相关文章推荐
- NGINX重启HTTPS站点要Enter PEM pass phrase输入密码
- 6-16位数字或密码,判断方法。
- Fragment放置后台很久(Home键退出很长时间),返回时出现Fragment重叠解决方案
- 支持向量机-SVM
- Android在一个APP中通过包名或类名启动另一个APP
- php curl的使用
- github/python/ show me the code 25题(一)
- Android 调用系统自带的电话和设置功能
- 呆瓜操作github for window
- 我的第一篇论文
- 直线mian函数跳转到mainret = main(argc, argv, envp);
- Objective-C利用正则表达式进行搜索时正则关键字的转义
- 蓝桥杯 奖券数目
- Enhance application security with FORTIFY_SOURCE
- dijit/Tree 部件美化
- java设计模式学习笔记第四章
- 常用正则表达式
- Google Chrome 浏览器的备用(离线)安装程序
- 模拟键盘输入
- android ANR产生原因和解决办法