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

标签: MystraAlgorithms离散重置
2503人阅读 评论(0) 收藏 举报

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


8
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2495466次
    • 积分:32528
    • 等级:
    • 排名:第152名
    • 原创:709篇
    • 转载:1篇
    • 译文:0篇
    • 评论:385条
    自我简介

    本人代码娴熟,涉猎广泛。

    目前任职于春雨医生的大数据部,数据挖掘工程师。

    曾经任职于春雨医生的移动端部,高级Android开发工程师。

    欢迎Follow我的GitHub:.

    https://github.com/SpikeKing

    文章分类
    最新评论