离散概率值(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