//概率算法_伪随机数生成_抛硬币实验
//
//实验平台: 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;
}