离散概率值(discrete) 和 重置\洗牌(shuffle) 算法 及 代码
本文地址: http://blog.csdn.net/caroline_wendy/article/details/17120687
离散概率值, 是根据离散分布的概率(归一化), 计算出一个随机的值, 概率越大, 离散值出现的可能性就越大;
原理: 随机生成一个0-1的值,顺次累加概率值, 大于等于随机值输出, 由于概率值越大, 相加之后跨度越大, 越有可能输出;
重置(洗牌)(shuffle), 是随机打乱数组的值, 保持原值不变, 更换位置;
原理:遍历数组, 随机生成一个当前值, 之后的值, 即[当前值, 之后的值], 交换位置;
1 /* 2 * Algorithms.java 3 * 4 * Created on: 2013.12.03 5 * Author: Wendy 6 */ 7 8 /*eclipse std kepler, jdk 1.7*/ 9 10 public class Algorithms 11 { 12 //根据输入的概率数组, 随机输出离散的值 13 public static int discrete(double[] a) 14 { 15 double r = StdRandom.uniform(); 16 double sum = 0.0; 17 for(int i=0; i<a.length; i++) 18 { 19 sum += a[i]; 20 if(sum >= r) return i; 21 } 22 return -1; 23 } 24 25 //重置(洗牌), 把数组值的顺序打乱 26 public static void shuffle(double[] a) 27 { 28 int N = a.length; 29 for(int i=0; i<N; ++i) 30 { 31 int r = i + StdRandom.uniform(N-i); //"[ )"不能达到N-i, 最大N-i-1 将a[i]和a[i..N-1]中任意一个元素交换 32 double temp = a[i]; 33 a[i] = a[r]; 34 a[r] = temp; 35 } 36 } 37 38 public static void main(String[] args) 39 { 40 double[] a = {0.1, 0.4, 0.3, 0.2}; 41 StdOut.println("discrete value = " + discrete(a)); 42 shuffle(a); 43 for(int i=0; i<a.length; ++i){ 44 StdOut.print(a[i] + " "); 45 } 46 StdOut.println(); 47 } 48 }
输出:
1 [plain] view plain copy 2 3 discrete value = 2 4 shuffle : 0.3 0.2 0.4 0.1