Algorithms - 离散概率值(discrete) 和 重置\洗牌(shuffle) 算法 及 代码

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

Algorithms - 离散概率值(discrete) 和 重置\洗牌(shuffle) 算法 及 代码_第1张图片

你可能感兴趣的:(重置,algorithms,离散,Mystra)