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

来源:互联网 发布:少儿编程培训 编辑:程序博客网 时间:2024/06/06 06:59

离散概率值(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-1double 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 = 2shuffle : 0.3 0.2 0.4 0.1 


原创粉丝点击