随机函数 rand,srand,random,srandom 的区别与使用
2016-03-17 20:07
441 查看
origin: http://blog.csdn.net/langeldep/article/details/7192906
由于使用非线程安全的rand, 造成系统某些内存被无故修改,真是坑人呀
函数定义:
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好, 再者就是不是线程安全。
由于使用非线程安全的rand, 造成系统某些内存被无故修改,真是坑人呀
函数定义:
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好, 再者就是不是线程安全。
相关文章推荐
- leetcode--- Power of Two
- Android 软键盘详解
- Android View绘图机制
- java工程师最新面试题(java编程基础)
- 模式、关系范式与关系运算
- 复利计算完成总结
- socket编程
- 供水工程管线分段设计软件
- IOS 证书申请
- HDU 1012 u Calculate e
- SharePreferences的DB实现
- Qt之模型/视图(自定义进度条)
- [POJ1716]Integer Intervals(差分约束系统)
- Android软键盘弹出引起的各种不适终极解决方案
- 第3周小学生测试
- 删除主串中模式串出现的字符
- Qt之模型/视图(自定义进度条)
- 最小表示法+hash hdu2609 How many
- Codeforces Round #228 (Div. 1) A. Fox and Box Accumulation
- 删除主串中模式串出现的字符