【转】Algorithms 离散概率值(discrete)和重置、洗牌(shuffle)算法及代码

离散概率值(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   
原文地址:https://www.cnblogs.com/sggggr/p/9143833.html