概率算法_伪随机数生成_抛硬币实验

来源:互联网 发布:淘宝出售假冒商品三次 编辑:程序博客网 时间: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;
}

////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////

原创粉丝点击