概率算法_伪随机数生成_抛硬币实验
来源:互联网 发布:淘宝出售假冒商品三次 编辑:程序博客网 时间:2024/05/16 00:58
//概率算法_伪随机数生成_抛硬币实验
//
//实验平台: VC++.NET 2003
//建一个 Win32控制台程序
//
////////////////////////////////////////////////////////////
// 伪随机数生成的原理
// 随机数在概率算法中扮演着十分重要的角色。
// 在现实计算机上无法产生真正的随机数,
// 因此在概率算法中使用的随机数都是一定程度上随机的,
// 即伪随机数。
// 产生伪随机数最常用的方法是线性同余法。
// 由线性同余法产生的随机数序列 a1 , a2 , ... , an ...
// 满足
// a0 = d;
// an = ( b * a(n-1) + c ) mod m , n = 1 , 2 , ... ;
// b >= 0 , c >= 0 , d >= 0
// d称为随机序列的种子
// 如何选取常数 b , c , m 直接关系到所产生的随机序列的随机性能。
// 一般得应取 gcd( m , b ) = 1,因此可取 b 为一素数
////////////////////////////////////////////////////////////
//源程序:
// TossCoins.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
////////////////////////////////////////////////////////////
// 概率算法
// 伪随机数的生成
// 模拟抛硬币试验
////////////////////////////////////////////////////////////
#include "time.h"
#include "conio.h"
////////////////////////////////////////////////////////////
// begin of class RandomNumber
const unsigned long maxShort = 0x10000;
const unsigned long multiplier = 0x472e396d;
const unsigned long adder = 0x3039;
class RandomNumber
{
public:
RandomNumber( unsigned long s );
unsigned short Random( unsigned long n );
double fRandom(void);
private:
static unsigned long randSeed;
};
unsigned long RandomNumber::randSeed = time(NULL);
RandomNumber::RandomNumber( unsigned long s = 0 )
{
if( s == 0 )
randSeed += (unsigned long)time(NULL);
else
randSeed += s;
}
unsigned short RandomNumber::Random( unsigned long n )
{
randSeed = multiplier * randSeed + adder;
return (unsigned short)( (randSeed>>16) % n );
}
double RandomNumber::fRandom()
{
return Random( maxShort ) / (double)(maxShort);
}
// end of class RandomNumber
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
// begin of TossCoins
int TossCoins( int numberCoins )
{
//记录正面的次数
int tosses = 0;
RandomNumber random( 0 );
for( int i = 0 ; i < numberCoins ; i++ )
{
//如果出现正面,1表示正,则tosses++
if( random.Random( 2 ) )
tosses++;
}
return tosses;
}
// end of TossCoins
////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
//每次试验投 nCoins 次硬币
const int nCoins = 10;
//共进行 testTime 次试验
const int testTime = 50000;
int list[nCoins+1] = { 0 };
for( int i = 0 ; i < testTime ; i++ )
{
list[ TossCoins( nCoins ) ]++;
}
printf( "正面数/t实验数/t图/n" );
for( int i = 0 ; i <= nCoins ; i++ )
{
printf( "%d/t%d/t" , i , list[i] );
for( int j = 0 ; j < (double)200 * ( (double)list[i] / (double)testTime ) ; j++ )
printf( "." );
printf( "/n" );
}
getch();
return 0;
}
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
- 概率算法_伪随机数生成_抛硬币实验
- 69_伪随机数的生成
- 伪随机数生成算法
- 随机化算法(随机数产生并模拟抛硬币实验)
- 随机数模拟抛硬币实验
- 一个伪随机数生成算法
- 一个伪随机数生成算法
- C++伪随机数生成算法
- 伪随机数的生成算法
- 生成一串随机数的算法_发牌问题
- 随机数生成算法(伪随机数)
- 算法_动态规划_最少硬币问题
- Matlab中以指定的概率生成伪随机数
- 生成伪随机数的超级算法
- 伪随机数生成算法及性能检验
- 利用RSA算法生成伪随机数【转】
- 一个生成伪随机数的超级算法
- Redis源码中看伪随机数生成算法
- 数据库连接池简介
- 可恶的控件
- "易表"软件强大但高估用户水平
- .NET系统学习----Globalization & Resources
- 老树新芽 体验Visual Basic 9.0新功能
- 概率算法_伪随机数生成_抛硬币实验
- JavaMail quick start
- Receive email via POP3
- Speak the messages
- ArrayList的用法分析
- WML自动跳转
- 现代化 中国才刚刚开始[转]
- 工作流概述
- Windows Server 2003 R2 RC1