随机数----srand,rand
2015-08-06 17:03
232 查看
rand(void)用于产生一个伪随机unsigned int 整数。
srand(seed)用于给rand()函数设定种子。
如果srand每次输入的数值是一样的,那么每次运行产生的随机数也是一样的。
srand这个函数一定要放在循环外面或者是循环调用的外面,否则的话得到的是相同的数字。
MSDN中的例子:
// crt_rand.c
// This program seeds the random-number generator
// with the time, then displays
10 random integers.
//
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main( void )
{
int i;
// Seed the random-number generator with current time so
that
// the numbers will be different every time we run.
srand( (unsigned)time( NULL ) );
// Display 10 numbers.
for( i = 0; i < 10;i++ )
printf( " %6d\n", rand() );
printf("\n");
// Usually, you will want to generate
a number in a specific range,
// such as 0 to 100, like
this:
{
int RANGE_MIN = 0;
int RANGE_MAX = 100;
for (i = 0; i < 10; i++ )
{
int rand100 = (((double) rand() /
(double) RAND_MAX) * RANGE_MAX + RANGE_MIN);
printf( " %6d\n", rand100);
}
}
}
RAND_MAX表示整数所能表达的最大值
可以认为rand()在每次被调用的时候,它会查看:
1) 如果用户在此之前调用过srand(seed),给seed指定了一个值,那么它会自动调用
srand(seed)一次来初始化它的起始值。
2) 如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。
3) 如果在调用rand()之前没有调用过srand(seed),效果将和调用了srand(1)再调用rand()一样(1也是一个定值)。
要取得[a,b)之间的随机整数,使用(rand()
% (b-a))+ a (结果值将含a不含b),
其中(rand()
% (b-a))可以看成是取[a-a,b-a)即[0,b-a)之间的随机整数,后面再加上a就是取得[a,b)之间的随机整数。
在a为0的情况下,简写为rand() % b。
关于伪随机浮点数:
用rand() / double(RAND_MAX)可以取得0~1之间的浮点数(注意,不同于整型时候的公式,是除以,不是求模),举例:
double ran_numf=0.0;
srand((unsigned)time(0));
for(int i=0;i <10;i++){
ran_numf = rand() / (double)(RAND_MAX);
cout < <ran_numf < < " ";
}
运行结果为:0.716636,0.457725,…等10个0~1之间的浮点数,每次结果都不同。
如果想取更大范围的随机浮点数,比如1~10,可以将
rand() /(double)(RAND_MAX) 改为 rand() /(double)(RAND_MAX/10)
运行结果为:7.19362,6.45775,…等10个1~10之间的浮点数,每次结果都不同。
至于100,1000的情况,如此类推。
srand(seed)用于给rand()函数设定种子。
如果srand每次输入的数值是一样的,那么每次运行产生的随机数也是一样的。
srand这个函数一定要放在循环外面或者是循环调用的外面,否则的话得到的是相同的数字。
MSDN中的例子:
// crt_rand.c
// This program seeds the random-number generator
// with the time, then displays
10 random integers.
//
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main( void )
{
int i;
// Seed the random-number generator with current time so
that
// the numbers will be different every time we run.
srand( (unsigned)time( NULL ) );
// Display 10 numbers.
for( i = 0; i < 10;i++ )
printf( " %6d\n", rand() );
printf("\n");
// Usually, you will want to generate
a number in a specific range,
// such as 0 to 100, like
this:
{
int RANGE_MIN = 0;
int RANGE_MAX = 100;
for (i = 0; i < 10; i++ )
{
int rand100 = (((double) rand() /
(double) RAND_MAX) * RANGE_MAX + RANGE_MIN);
printf( " %6d\n", rand100);
}
}
}
RAND_MAX表示整数所能表达的最大值
可以认为rand()在每次被调用的时候,它会查看:
1) 如果用户在此之前调用过srand(seed),给seed指定了一个值,那么它会自动调用
srand(seed)一次来初始化它的起始值。
2) 如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。
3) 如果在调用rand()之前没有调用过srand(seed),效果将和调用了srand(1)再调用rand()一样(1也是一个定值)。
要取得[a,b)之间的随机整数,使用(rand()
% (b-a))+ a (结果值将含a不含b),
其中(rand()
% (b-a))可以看成是取[a-a,b-a)即[0,b-a)之间的随机整数,后面再加上a就是取得[a,b)之间的随机整数。
在a为0的情况下,简写为rand() % b。
关于伪随机浮点数:
用rand() / double(RAND_MAX)可以取得0~1之间的浮点数(注意,不同于整型时候的公式,是除以,不是求模),举例:
double ran_numf=0.0;
srand((unsigned)time(0));
for(int i=0;i <10;i++){
ran_numf = rand() / (double)(RAND_MAX);
cout < <ran_numf < < " ";
}
运行结果为:0.716636,0.457725,…等10个0~1之间的浮点数,每次结果都不同。
如果想取更大范围的随机浮点数,比如1~10,可以将
rand() /(double)(RAND_MAX) 改为 rand() /(double)(RAND_MAX/10)
运行结果为:7.19362,6.45775,…等10个1~10之间的浮点数,每次结果都不同。
至于100,1000的情况,如此类推。
相关文章推荐
- Extjs4 grid 鼠标响应事件
- JUnit4概述
- 消息分发机制。
- 百度地图 Fragment之间切换黑屏现象解决方案
- GraphX 实现K-Core
- Max Sum
- STL中 map的用法
- HDU 4229 Vive la Difference!
- 其他主机连接本地主机Tomcat会出现的防火墙问题
- 在Eclipse中使用JUnit4进行单元测试(高级篇)
- 《Objective-C基础教程》第3章 面向对象编程的基础知识
- LightOJ 1051 Good or Bad
- 1040:As Easy As A+B
- CUDA安装
- Android Http请求框架一:Get 和 Post 请求
- jquery的ajax提交时“加载中”提示的处理方法
- wireshark抓包的过滤规则
- java Study 基础 1
- MySQL文件结构
- caffe study(4) - 优化算法基本原理