日期:2014-05-20  浏览次数:20599 次

指定概率的算法
最少代码写出数组概率方法。
数组每位表示该位的概率。


int[] prob = {20,30,20,8,2,5,3,1,1,10};

------解决方案--------------------
先顶个,大神在楼下
------解决方案--------------------
大神还在楼下,另外,能不能解释详细点
------解决方案--------------------
引用:
最少代码写出数组概率方法。
数组每位表示该位的概率。
int[] prob = {20,30,20,8,2,5,3,1,1,10};

没明白什么是【数组概率方法】
------解决方案--------------------
既然楼主说的不是很清楚,那我就先yy一下吧!
数组概率就是说,prob有10个元素,分别对应0到9的每一位;
而prob的元素和为100,证明是同一个事件,就是说随机抽出一位,0到9的概率分别如prob所列。

------------------------------------------

思路:
prob的元素映射成0到99的区间有以下关系:
[20, 30, 20, 8, 2, 5, 3, 1, 1, 10]  -->  [20, 50, 70, 78, 80, 85, 88, 89, 90, 100]
由于0到99的随机数是均匀分布的,所以每个元素占的长度,就是相当于被选中的概率。
所以,只要看0到99的随机数random,在哪一个区间,就知道是哪个数字被选中了。

下面代码主要就是【sum += prob[i]】和【if (random <= sum)】,其他都是假设条件。
这里先假设prob的元素全部为10,这样输出结果更容易看出来他们之间的关系。楼主换成原来的prob就行。


int[] prob = {10, 10, 10, 10, 10, 10, 10, 10, 10, 10};
int[] num = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int sum = 0;
int random = (int) (Math.random() * 100);
for (int i = 0; i < prob.length; i++) {
    sum += prob[i];   // 概率段
    if (random <= sum) {   // 一大于,就是踏入了该概率段
        System.out.println("random: " + random + " - " + num[i]);
        break;
    }
}

------解决方案--------------------
不敢臆度楼猪题目意思
我只是隐约想到一个算法的影子,哈夫曼编码