随机数生成
来源:互联网 发布:亿星软件 编辑:程序博客网 时间:2024/05/12 11:27
随机数生成
根据指数分布实现随机数生成,首先看一个实际的例子。
和女友分手了,我连她的影都找不着。
只好给她打电话。可是她电话也不接。
我只好耐心的一遍一遍的打。可是她始终不接。
我每小时打10个电话。打了一整天。
那我每隔几分钟打一个呢?
指数分布可以用来表示独立随机事件发生的时间间隔,
比如旅客进机场的时间间隔、我打电话的时间间隔等。
我写了个程序,用指数分布模拟我打电话的时间间隔。
指数分布的数学公式我就不贴到这里了。书里和网上都有。
代码在后面。
编译:
g++ -g -W -Wall -Wextra -o mytest main.cpp
执行:
./mytest
在fedora 11上测试过。
这是某次执行的部分输出。太长省略了一部分。
***********************************************
1.65161
12.2172
11.4074
9.04574
6.04179
5.25208
24.502
0.166724
8.59661
5.24023
2.99059
1.22649
16.0207
...
...
...
...
3.62825
7.16335
2.52672
2.04934
4.00023
9.14412
0.385669
6.20385
1.64365
0.0636913
1.37361
6.474
3.56655
0.791988
3.34955
==================================
average is 5.93692
*************************************************
最后一行表明我平均间隔不到六分钟就给她打个电话。
每小时打10个电话,根据指数分布,概率期望正好等于
1/10小时,即6分钟。
看来我对她的爱还是很执着的。无奈,人家找了个有房的,
而我人穷脾气破。
从头再来吧。
main.cpp:
===========================================
// 2011年 09月 09日 星期三 15:01:55 CST
// author: 李小丹(Li Shao Dan) 字 殊恒(shuheng)
// K.I.S.S
// S.P.O.T
#include <iostream>
#include <iomanip>
#include <cmath>
#include <ctime>
using namespace std;
static unsigned long next = 1;
static void mysrand(unsigned seed)
{
next = seed;
}
static int myrand(void)
{
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}
static double exp_distribute(double m)
{
double x;
while((x = myrand() / (double)32768) == 0.0);
return -m * log(x);
}
int main()
{
mysrand(time(0));
double sum = 0;
double itv;
for(int i = 0; i < 240; ++i) {
itv = exp_distribute(1.0 / 10) * 60;
sum += itv;
cout << setprecision(6) << itv << endl;
}
cout << "==================================\n";
cout << "average is " << sum / 240 << endl;
return 0;
}
根据指数分布实现随机数生成,首先看一个实际的例子。
和女友分手了,我连她的影都找不着。
只好给她打电话。可是她电话也不接。
我只好耐心的一遍一遍的打。可是她始终不接。
我每小时打10个电话。打了一整天。
那我每隔几分钟打一个呢?
指数分布可以用来表示独立随机事件发生的时间间隔,
比如旅客进机场的时间间隔、我打电话的时间间隔等。
我写了个程序,用指数分布模拟我打电话的时间间隔。
指数分布的数学公式我就不贴到这里了。书里和网上都有。
代码在后面。
编译:
g++ -g -W -Wall -Wextra -o mytest main.cpp
执行:
./mytest
在fedora 11上测试过。
这是某次执行的部分输出。太长省略了一部分。
***********************************************
1.65161
12.2172
11.4074
9.04574
6.04179
5.25208
24.502
0.166724
8.59661
5.24023
2.99059
1.22649
16.0207
...
...
...
...
3.62825
7.16335
2.52672
2.04934
4.00023
9.14412
0.385669
6.20385
1.64365
0.0636913
1.37361
6.474
3.56655
0.791988
3.34955
==================================
average is 5.93692
*************************************************
最后一行表明我平均间隔不到六分钟就给她打个电话。
每小时打10个电话,根据指数分布,概率期望正好等于
1/10小时,即6分钟。
看来我对她的爱还是很执着的。无奈,人家找了个有房的,
而我人穷脾气破。
从头再来吧。
main.cpp:
===========================================
// 2011年 09月 09日 星期三 15:01:55 CST
// author: 李小丹(Li Shao Dan) 字 殊恒(shuheng)
// K.I.S.S
// S.P.O.T
#include <iostream>
#include <iomanip>
#include <cmath>
#include <ctime>
using namespace std;
static unsigned long next = 1;
static void mysrand(unsigned seed)
{
next = seed;
}
static int myrand(void)
{
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}
static double exp_distribute(double m)
{
double x;
while((x = myrand() / (double)32768) == 0.0);
return -m * log(x);
}
int main()
{
mysrand(time(0));
double sum = 0;
double itv;
for(int i = 0; i < 240; ++i) {
itv = exp_distribute(1.0 / 10) * 60;
sum += itv;
cout << setprecision(6) << itv << endl;
}
cout << "==================================\n";
cout << "average is " << sum / 240 << endl;
return 0;
}
- 【随机数】生成随机数模板
- 生成随机数
- 随机数生成
- 随机数生成
- 生成随机数
- 生成随机数
- 生成随机数
- 随机数生成
- 随机数生成
- 生成随机数
- 生成随机数
- 随机数生成
- 随机数生成
- 生成随机数
- 生成随机数
- 随机数生成...
- 随机数生成
- 随机数生成
- JDBC简介(二)
- asp.net里导出excel表方法汇总
- 花店橱窗布置问题
- ubuntu下ssh登录远程主机
- 关于编码的一些理解
- 随机数生成
- poj1988cube_stacking
- 把自己当成别人、把别人当成自己、把别人当成别人、把自己当成自己
- C语言中基本的输入和输出函数的用法第一讲(C语言学习随笔三)
- 第一次分享
- 华为3com router基础命令
- 关于编译内核时候出现__gnu_mcount_nc的问题以及解决办法
- Windows8安装使用初体会
- C++对C的兼容和继承