voip
风的方向
厚德致远,博学敦行!
C++博客
首页
新随笔
新文章
联系
聚合
管理
posts - 52,comments - 21,trackbacks - 0
<
2010年9月
>
日
一
二
三
四
五
六
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
哥哥回来了~~
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(1)
给我留言
查看公开留言
查看私人留言
随笔分类
C++学习(3)
Questions(15)
生活琐事(4)
算法设计与分析(17)
学习到的一些小知识(3)
随笔档案
2016年12月 (1)
2010年11月 (1)
2010年10月 (8)
2010年9月 (39)
2010年8月 (3)
牛人
ACM
matrix67
RyanWang
第四维
过客空间
刘品
音频处理
牵着老婆。。
搜索
最新评论
1. re: min和max头文件
这位说的是对的~我用algorithm就是不行
--maxmin
2. re: min和max头文件[未登录]
algorithm是stl的东西,要用std::max
--123
3. re: 过河卒[未登录]
@cs
什么都百度要脑袋有嘛用~兄弟~
--jince
4. re: 过河卒
不能过
--cs
5. re: min和max头文件
是应该在stdlib里面
--mushroom
阅读排行榜
1. min和max头文件(27563)
2. 最少硬币问题 (3744)
3. 均分纸牌(2893)
4. 矩阵相乘(2521)
5. 整数划分(2428)
评论排行榜
1. min和max头文件(4)
2. 整数划分(2)
3. 免费馅饼(2)
4. 最大和子段(2)
5. 随机数(2)
随机数应用
学以致用!!!
随机数可以用来计算概率,面积等!!
一、随机数,模拟抛硬币正面时间频率图。
代码如下:
#include
<
iostream
>
#include
<
time.h
>
using
namespace
std;
const
unsigned
long
maxshort
=
65536L
;
const
unsigned
long
multiplier
=
1194211693L
;
const
unsigned
long
adder
=
12345L
;
class
RandomNumber
{
private
:
unsigned
long
randSeed;
//
随机种子
public
:
RandomNumber(unsigned
long
s
=
0
);
//
构造函数,为randSeed置数
unsigned
short
Random(unsigned
long
n);
//
获取0~n的一个随机数
double
fRandom(
void
);
//
获取一个小数
}
;
RandomNumber::RandomNumber(unsigned
long
s)
{
if
(s
==
0
)
randSeed
=
time(
0
);
//
这里获取直接用time函数获取了一个时间值当做种子了,没有再用srand函数构造种子了!网上查了下time()函数为从1970年1月1日0时0分0秒到此时的秒数!!!
else
randSeed
=
s;
}
unsigned
short
RandomNumber::Random(unsigned
long
n)
{
//
printf("randSeed:%lu \nmultiplier:%lu \nrandSeed*multiplier:%lu\n",randSeed,multiplier,randSeed*multiplier);
randSeed
=
multiplier
*
randSeed
+
adder;
//
这里存在一个越界问题,但是还是会从新获得一个randSeed
//
printf("(randSeed>>16):%lu\n",randSeed>>16);
return
(unsigned
short
)((randSeed
>>
16
)
%
n);
//
右移16为再与n取余,从而获得一个0~n的随机数,其实我还不明白,为啥还要右移呢?难道是为了随机性?
}
double
RandomNumber::fRandom(
void
)
{
return
Random(maxshort)
/
double
(maxshort);
}
int
TossCoins(
int
numberCoins)
{
static
RandomNumber coinToss;
//
注意了这里定义了一个静态变量,在函数反复调用中coinToss的属性值不变,从构造函数的角度来理解,在函数反复调用过程中,该对象是不会重新去构造的(不会重复调用构造函数的)!
int
i,tosses
=
0
;
for
(i
=
0
;i
<
numberCoins;i
++
)
//
这里调用Random函数!!
{
tosses
+=
coinToss.Random(
2
);
//
返回0或1,1表示正面,0表示反面,累计正面朝上的次数
}
return
tosses;
//
返回正面朝上的次数
}
void
main()
{
const
int
NCOINS
=
10
;
//
定义了常量,我从一些牛人哪里看到,我们应该把静态变量看成只读。。。
const
long
NTOSSES
=
50000L
;
long
i,heads[NCOINS
+
1
];
//
h[i]代表NTOSSES次抛NCOINS次抛硬币中i次正面次数,貌似有些拗口,按这个实例来说,应该是做50000次抛10次硬币,然后统计10次中出现0次正面朝上次数,1次正面朝上次数,。。10次正面朝上次数
int
j,position;
for
(j
=
0
;j
<
NCOINS
+
1
;j
++
)
heads[j]
=
0
;
for
(i
=
0
;i
<
NTOSSES;i
++
)
//
累计
heads[TossCoins(NCOINS)]
++
;
cout
<<
"
head结果:
"
;
for
(i
=
0
;i
<=
NCOINS;i
++
)
//
输出h结果
{
cout
<<
heads[i]
<<
"
"
;
}
cout
<<
endl;
for
(i
=
0
;i
<=
NCOINS;i
++
)
//
模拟抛硬币正面事件平率图
{
position
=
int
(
float
(heads[i])
/
NTOSSES
*
100
);
//
这里有强制类型转换,其实这里计算了概率,通过强制类型转换成整数!!!
cout
<<
i
<<
"
"
;
for
(j
=
0
;j
<
position
-
1
;j
++
)
//
输出空格
cout
<<
"
"
;
cout
<<
"
*
"
<<
endl;
}
}
运行结果如下:
二、随机数,计算∏。基本思想也是运用了概率事件!设有一个半径为r的圆及其外切四边形,向该图形投掷N个点。设落入圆内的点数为K,由于投入的点在正方形上分布均匀,所以落入圆中的概率为∏*R^2/4/R^2,从投点的角度考虑,该概率为K/N,当N足够大时,我们可以近似的认为二者相等。从而∏=4*K/N。
代码如下:
double
Darts(
int
n)
{
static
RandomNumber dart;
int
k
=
0
;
for
(
int
i
=
1
;i
<=
n;i
++
)
{
double
x
=
dart.fRandom();
double
y
=
dart.fRandom();
if
((x
*
x
+
y
*
y)
<=
1
)
k
++
;
}
return
4
*
k
/
double
(n);
}
当n=500000000时,运行结果如下:
printf输出:
http://hi.baidu.com/jiaju111/blog/item/dcd7fd8ba9a7fa1ac9fc7ae2.html
C语言时间日期函数说明:
http://www.cnblogs.com/neonlight/archive/2008/08/22/1273942.html
posted on 2010-09-13 15:51
jince
阅读(627)
评论(0)
编辑
收藏
引用
所属分类:
算法设计与分析
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
集合划分
电路布线
随机数应用
0-1背包问题
最大m子段和
最大和矩阵
随机数
二分搜索
汉诺塔
循环赛
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
哈哈哈哈哈哈