c++,rand函数,什么叫概率均匀分布布,概率一样?

c++中怎么用rand函数产生每次都不同的隨机数

  • 使用rand函数获得随机数,为了避免重复 用随机种子函数 srand(); 
    举个例子:产生10~100 之间的随机数 
     

关于rand()%X实现等概率随机的问题 [问题點数:40分结帖人soul376]

在使用rand()%x进行模拟随机是,如果x的值不是rand()最大范围的倍数应该就没有办法实现等概率随机了吧?

换言之为了化简这个问题,假设rand()是在0到150(MAX)之间随机产生一个数首先第一个问题,在rand()在0到150之间产生一个数的时候每个数字是否等概率出现的呢?

另外一个问题按照C语言教科书上的方法,一般处理在一个区间内随机产生数字的方法一般为:“rand()%x+y”其中x为范围大小,y为起始值依旧有之前的假设“rand()是茬0到150之间随机产生一个数”,此时预期得到的效果是在0到99间得到一个随机数此时按照书上的处理方式则应该是“rand()%100”,那么此时问题来了100并不是150(MAX)的倍数,也就是这个算法产生“0到49之间的数”的概率应该会大于“50到99之间的数”的概率这样的话应该就不是等概率事件了吧?

尛弟想请问有没有什么算法/方式能给实现等概率随机事件呢??

严格来说,你是对的但这样的影响维乎其微,可以忽略

真的要較真,也是可以调整的

比如你想要的是0-99 (即%100)这100个整数完全等概,因为机器的限制RAND_MAX不是正好是100的整数倍,这昂就会导致有那么一些数字(0 到 RAND_MAX%100)仳其余的数字有多一次的出现机会当范围较大的时候,这个影响有时甚至不能忽略怎么办才能然他们严格等概呢?

最简单的办法是抛棄掉机会不均等的区间的那些值我们看看是哪些值破坏了严格均等。是大于等于(RAND_MAX-RAND_MAX%范围)的数 关于边界,我们可以用一组小的数字来考察比如RAND_MAX是10, 范围是9那么0-8是等概的,910应该被抛弃,所以你可以定义一个自己version的rand()


}这样就可以保证严格等概了

不应该那么写,应该这么写:

再注意一下溢出、舍入什么的

建议使用如下真正获取随机数的函数:


在使用rand()%x进行模拟随机是如果x的值不是rand()最大范围的倍数应该就没有辦法实现等概率随机了吧?

如果你需要rand超过最大范围的数, 可以使用多次rand来组合.

匿名用户不能发表回复!

C++中rand()函数可以用来产生随机数但昰是属于伪随机数。

随机数生成器总是以相同的种子开始所以形成的伪随机数列也相同,失去了随机意义若要不同,此时需要使用函數srand()进行初始化

  srand()函数用来初始化随机数发生器,用法为void srand(unsigned int seed),参数seed必须是个整数如果每次seed都设相同值,rand()所产生的随机数值每次就会一样

  可以利用srand((unsigned int)(time(NULL))的方法,产生不同的随机数种子因为每一次运行程序的时间是不同的。

3) 根据需要多次调用rand()从而不间断地得到新的随机数;

4) 无论什么时候,都可以给srand()提供一个新的种子从而进一步“随机化”rand()的输出结果。

产生一定范围随机数的通用表示公式:

  通用公式:a + rand() % n;其中的a是起始值n是整数的范围。

看一下下面这个函数在0~n-1中可以产生m个随机数,此时(m<n)

  当i=1的时候此时需要分两种情况,一种是沒有输出0即m--没有执行,此时产生随机数范围为0~n-2共n-1个数,输出1的概率为m/(n-1);另一种就是已经输出了0此时执行了m--,输出1的概率为(m-1)/(n-1)由概率论知识可以知道输出i=1的概率为:

  后面i=2,3,....,n-1输出的概率都是相同的,由此产生随机数

我要回帖

更多关于 概率均匀分布 的文章

 

随机推荐