概率条件下随机数的生成

问题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


'随机产生一个 【a,b】之间的数字,包括a和b
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个数字:



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值