问题1: 有数字1,2,3,它们出现的概率分别为 0.2,0.3,0.5,现在要随机生成一个数字(1/2/3),使得满足上述概率,要怎样实现。
我们把这个问题一般化,就成了一个数学问题:
假设有数字N1,N2,N3,N4...Nn 它们出现的概率分别为 P1,P2,P3,P4...Pn ,其中 P1+P2+P3+P4+...+Pn=1,怎样在满 足以上条件下随机生成一个属于N1-Nn的随机数。
这个数学问题如何用计算机来实现?
思路:制作一个新的表pTable,这个表有200个1,300个2,500个3,然后我们随机生成一个1-1000的数字m,然后ptable(m)即我们需要随机生成的数字。
代码VBA:
'numberString:数字集合,String
'pString:概率集合,String
Function getAnNumberInProbability(numberString, pString)On Error Resume Next
numbers = Split(numberString, ",")
ps = Split(pString, ",")
Dim pTable(1 To 2000)
R = 0
For i = 0 To UBound(numbers)
For j = 1 To Val(ps(i)) * 1000
M = M + 1
pTable(M) = numbers(i)
Next
Next
getAnNumberInProbability = pTable(getAnNumberIn(1, M))
End Function
Function getAnNumberIn(a, b) As Integer
Randomize
getAnNumberIn = Int((b - a + 1) * Rnd()) + a
End Function
这样我们用:=getAnNumberInProbability("1,2,3", "0.2,0.3,0.5") 即可获得满足概率条件下的随机数。
测试1000个数字:
附Java代码:
package MathAndProbability;
import java.util.Random;
public class MathAndProbability {
//随机生成一个a-b之间的数字, 包括a,b
public static int getAnNumberIn(int a,int b){
return new Random().nextInt(b-a+1)+a;
}
//根据概率生成随机数
public static int getAnNumberInProbability(int[] numbers, double[] ps){
int[] pTable= new int[2000] ;
int M=1;
for (int i=0;i<numbers.length;i++){
for(int j=1;j<=(int)(ps[i]*1000);j++){
M=M+1;
pTable[M]=numbers[i];
}
}
return pTable[getAnNumberIn(1, M)];
}
public static void main(String[] args) {
int[] numbers={1,2,3};
double[] ps={0.2,0.3,0.5};
for(int t=0;t<1000;t++){
System.out.println(getAnNumberInProbability(numbers, ps));
}
}
}
测试1000个数字: