离散概率值(discrete) 和 重置\洗牌(shuffle) 算法 及 代码
本文地址: http://blog.csdn.net/caroline_wendy/article/details/17120687
离散概率值, 是根据离散分布的概率(归一化), 计算出一个随机的值, 概率越大, 离散值出现的可能性就越大;
原理: 随机生成一个0-1的值,顺次累加概率值, 大于等于随机值输出, 由于概率值越大, 相加之后跨度越大, 越有可能输出;
重置(洗牌)(shuffle), 是随机打乱数组的值, 保持原值不变, 更换位置;
原理:遍历数组, 随机生成一个当前值, 之后的值, 即[当前值, 之后的值], 交换位置;
代码如下:
/*
* Algorithms.java
*
* Created on: 2013.12.03
* Author: Wendy
*/
/*eclipse std kepler, jdk 1.7*/
public class Algorithms
{
//根据输入的概率数组, 随机输出离散的值
public static int discrete(double[] a)
{
double r = StdRandom.uniform();
double sum = 0.0;
for(int i=0; i<a.length; i++)
{
sum += a[i];
if(sum >= r) return i;
}
return -1;
}
//重置(洗牌), 把数组值的顺序打乱
public static void shuffle(double[] a)
{
int N = a.length;
for(int i=0; i<N; ++i)
{
int r = i + StdRandom.uniform(N-i); //"[ )"不能达到N-i, 最大N-i-1
double temp = a[i];
a[i] = a[r];
a[r] = temp;
}
}
public static void main(String[] args)
{
double[] a = {0.1, 0.4, 0.3, 0.2};
StdOut.println("discrete value = " + discrete(a));
shuffle(a);
for(int i=0; i<a.length; ++i){
StdOut.print(a[i] + " ");
}
StdOut.println();
}
}
输出:
discrete value = 2
shuffle : 0.3 0.2 0.4 0.1