关于随机函数与概率设置

1、C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX必须至少为32767。rand()函数不接受参数,默认以1为种子(即起始值)。随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。

   2、C++中另一函数srand( ),可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪随机数列也相同。一个办法是让用户输入种子,但是仍然不理想。 
   3、比较理想的是用变化的数,比如时间来作为随机数生成器的种子。 time的值每时每刻都不同。所以种子不同,所以,产生的随机数也不同。 
// C++随机函数
#include <stdlib.h> 
#include <iostream.h> 
#include <time.h> 
#define MAX 100 
void main()
    srand( (unsigned)time( NULL ) );//srand()函数产生一个以当前时间开始的随机种子 
   for (int i=0;i<10;i++) 
   cout<<rand()%MAX<<endl;//MAX为最大值,其随机域为0~MAX-1
二、rand()的用法   
   rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数。这样,如果你要产生0~10的10个整数,可以表达为: 
  int N = rand() % 11; 
   这样,N的值就是一个0~10的随机数,如果要产生1~10,则是这样: 
  int N = 1 + rand() % 10; 
三、按要求设置概率
比如要设置一个10%的概率问题,我们可以采取rand()函数来实现,在if条件句判断里,用rand()得到的值%一个设定的值,再与另一个值做“==”运算。
例如:
if(1==rand())
{ //10%的概率达成,这里编辑余下代码}
else
{ //90%的概率没达成,这里编辑余下代码}
 
四、srand()的用法    
     为得到不同的随机数序列,则需改变这个种子的值。方法:在开始产生随机数前,调用一次srand(time(NULL))(注意:srand()一定要放在循环外面或者是循环调用的外面,否则的话得到的是相同的随机数)。

#include <iostream>     
using namespace std;     
#include <stdlib.h>     
#include <time.h>     
int main( )     
{     
    int i;     
    srand((unsigned)time(NULL)); //初始化随机数种子     
    for (i=0; i<10; i++)         //产生10个随机数     
    {     
        cout<<rand()<<"\t";     
    }     
    cout<<endl;     
    return 0;     
}   
五、几种随机数的简单算法
 
1.产生一个范围内的随机数
一般地,我们可用j=1+(int)(n*rand()/(RAND_MAX+1.0))来生成一个0到n之间的随机数。
若用int x = rand() % 101;来生成 0 到 100 之间的随机数这种方法是不可取的,比较好的做法是:
 j=(int)(100.0*rand()/(RAND_MAX+1.0)) 
 
2、筛选型随机数 如希望取0-99的随机数,但不能是6。 
解决方法: 
x = random(100);
while (x==6) { 
x = random(100);
又如希望取0-99的随机数,但不要5的倍数 解决方法:
x = random(100);
while ((x % 5)==0) {
x = random(100);
}
3、从连续的一段范围内取随机数。
如从40--50的范围内取随机数。 解决方法: x=random(11)+40
4、从一组乱数中取随机数。 如:从 67, 87, 34, 78, 12, 5, 9, 108, 999, 378十个数中随机取数。解决方法:可以用数组将些十个数存贮,然后把0--9中取出的随机数作为序号,实现随机取数。 
a = new Array(67, 87, 34, 78, 12, 5, 9, 108, 999, 378);
j = random(10);
x = a[j];
 
六、产生一定范围随机数的通用算法公式
▲要取得[a,b)的随机整数,使用(rand() % (b-a))+ a (结果值含a不含b)。
▲要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a (结果值含a和b)。
▲要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1 (结果值不含a含b)。
▲即(通用公式:a + rand() % n;取得[a,a+n) 的随机整数,其中的a是起始值,n是整数的范围。)
▲要取得[a,b) 的随机整数,另一种表示:a + (int)(b-a) * rand() / (RAND_MAX + 1)
▲要取得[a,b] 的随机整数 另一种表示:a + (int)(b-a) * rand() / (RAND_MAX )。
▲要取得[0,1] 之间的浮点数 ,可以使用rand() / double(RAND_MAX)。

posted on 2012-06-28 18:12  很多不懂呀。。  阅读(903)  评论(0编辑  收藏  举报

导航