一些关于概率的算法的个人总结

时间:2022-06-23 00:01:34

第一个大概是我人生中的第一次面试遇到的问题吧。问题如下:如何随机出0~n之间的整数,并且每次随机出的数字不能相等但要求随机出的每个数字的概率是相等的。作为一个初涉计算机(虽然是研究生了,起步略晚)对自己又有极大自信的我,想出了各种方法,然后一一被面试官拍死。面试完后在《编程珠玑》的习题上看到了解法:

构造包含1-100的顺序数组s,数组内的值等于其下标,最大的数是max=100。然后rand(0,max)出一个数字n,之后把s[max]和s[n]交换数据,然后把max减一。后面一次循环,这样可以保证每次取的数字不相等,又能保证概率都相等。如第一次取的话是0.01,那么第二次取的概率根据概率论是第一次的概率乘以第二次的概率即(99/100)*(1/99)=0.01。以此类推,取所有数字的概率都为0.01。

第二个是如何用rand(5)构造rand(n)。这个问题的关键是产生的数字范围要包含0~n,且产生0~n的概率相等。所以要用rand(k)*m+rand(k),这样可以产生0~(km+k-1)的数,且每个数产生的概率都是相等,这样只要km+k-1)是大于n的倍数的某个数,就能得到均匀分布的rand(n)了,所以这一题可用递归。