`
kitsionchen
  • 浏览: 23382 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
最近访客 更多访客>>
社区版块
存档分类
最新评论

随机化

    博客分类:
  • code
阅读更多
慢慢开始有感觉数学对写程序有很多影响.真后悔上上学期的离散数学和概率老是逃课!!
拜读了云风老大的"泊松分布"联想到要有较好的数学和概率基础才能搞出所谓的随机化算法.
搞一个例子吧:
泊松分布一般适用于发生一次的概率很小事件.例如:一门很容易的考试,结果还是有一两个不及格(失礼了,小弟曾经是其中一个.),还有比如购买彩票等等事件,中奖概率很小的事件.假如中奖概率为14000000:1,假设抽取的号码是随机的而且独立的,如果一个人购买彩票越多,中奖概率增加,但两个人买一样多的彩票,概率不会增加,因为是事件独立的.
当中奖人数的期望为2时的彩票中奖者分布如下所示:
中奖彩票数    0                1            2            3            4            5
概率                0.135     0.271    0.272    0.180    0.090    0.036

为了产生一个泊松分布且期望为a的随机无符号数,可以采用重复产生区间(0,1)中均匀分布的随机数直至乘积小于或等于e^(-a),(引用一本国外有关教材采用的策略)在程序代码中把均匀分布的随机数的对数相加,直至所产生的和小于或等于-a.

代码如下:

package kitsion.util;
/*Random number clas, using a 31-bit
线性同余数算法产生均匀分布(linear congruential generator)
*/
public class Random2
{
    private static final int A = 48271;
    private static final int M = 2147483647;        //=2^31-1,素数
    private    static final int Q = M/A;
    private static final int R = M%A;
    private int state;

    /*
    *Construct this Random object with initial state obtained from system clock.
    */
    public Random2()
    {
        this((int)(System.currentTimeMillis() % Integer.MAX_VALUE));
    }

    /*
    *Construct this Random object with specified initial state.
    *@param initialValue the initial value
    */
    public Random2(int initialValue)
    {
        if(initialValue < 0)
            initialValue += M;
        state = initialValue;
        if(state <= 0)
            state = 1;
    }
   
    /*
    *Return a preudorandom int, and change the initial state.
    */
    public int nextInt()
    {
        int tmpState = A * (state % Q) - R * (state / Q);
        if(tmpState >= 0)
            state = tmpState;
        else
            state = tmpState + M;
        return state;
    }
    /*
    *Return a pseudorandom double in the open range0..1
    *and change the internal state
    *@return the pseudorandom double
    */
    public double nextDouble()
    {
        return (double)nextInt() / M;
    }
    /*
    *Return an int using a Poisson distribution, and change the internal state.
    *@param expectedValue the mean of the distribute
    *@return the pseudorandom int.(柏松分布,由均匀分布产生非均匀分布)
    */
    public int nextPoisson(double expectedValue)
    {
        double limit = -expectedValue;
        double product = Math.log(nextDouble());
        int count;
        for(count = 0; product>limit; count++)
            product += Math.log(nextDouble());
        return count;
    }
     /*
     *Method to swap to elements in an array.
     *@param a an array of objects
     *@param index1 the index of the first object.
     *@param index2 the index of the second object
     */
     private static final <AnyType> void swapReferences(AnyType[] a, int index1, int index2)
    {
        AnyType tmp = a[index1];
        a[index1] = a[index2];
        a[index2] = tmp;
     }
    //Test program
    public static void main(String[] args)
    {
        Random2 r = new Random2();
        for(int i = 0; i < 20; i++)
        {
            System.out.println(r.nextInt());
        }
        int[] dist = new int[10000];
        final int SAMPLES = 1000000;
        for(int i = 0; i < SAMPLES; i++)
            dist[r.nextPoisson(2)]++;
        for(int i = 0; i < 10; i++)
            System.out.println(i + "中奖概率: " + dist[i] / (double)SAMPLES);
    }
}

运行结果:


1379218482
2114803975
920033433
972024383
218788490
1962108491
320201773
1019977024
2100834382
903674888
1602680784
2053224936
555609312
2041315816
1216095188
665329203
488017128
1326661745
1326739355
778084371
0中奖概率: 0.13589
1中奖概率: 0.270387
2中奖概率: 0.270704
3中奖概率: 0.18035
4中奖概率: 0.090164
5中奖概率: 0.036003
6中奖概率: 0.011939
7中奖概率: 0.003439
8中奖概率: 8.86E-4
9中奖概率: 1.95E-4
分享到:
评论

相关推荐

    《论随机化算法的原理与设计》

    《论随机化算法的原理与设计》这篇论文由上海市控江中学的周咏基撰写,主要探讨了随机化算法的概念、设计方法及其在信息学问题解决中的应用。随机化算法是一种利用随机函数影响算法执行流程或结果的策略,其有效性并...

    确定性快速排序与随机化快速排序的比较

    为了避免这种情况,提出了随机化快速排序的概念。 随机化快速排序在选择基准元素时引入随机性,使得算法的效率不依赖于输入序列的顺序,从而保证了算法的平均效率。其期望的运行时间复杂度为Θ(nlogn)。在随机化...

    10.刘家骅《浅谈随机化在信息学竞赛中的应用》1

    【随机化算法在信息学竞赛中的应用】 随机化算法,作为一种新兴且独特的算法,近年来在信息学竞赛中逐渐崭露头角。随着竞赛题目日益复杂,新型算法不断涌现,掌握随机化算法对于参赛者而言,意味着拥有了更多解决...

    算法分析 递归与分治策略 动态规划 贪心算法 分支限界法 随机化算法等算法

    在IT领域,算法是解决问题的核心工具,而递归与分治策略、动态规划、贪心算法、回溯法、分支限界法以及随机化算法都是其中的重要组成部分。这些算法不仅适用于计算机科学,也在数据结构、优化问题和复杂计算中扮演着...

    基于Linux地址空间随机化的缓冲区溢出研究.pdf

    基于 Linux 地址空间随机化的缓冲区溢出研究 本研究论文主要探讨了缓冲区溢出攻击在 Linux 系统下的防御方法,特别是通过地址空间随机化技术来防御缓冲区溢出攻击。_paper首先分析了缓冲区溢出攻击的原理,然后讨论...

    绕过PE文件地址随机化

    通过修改分析PE文件中的属性,修改地址随机化标志,并对PE文件进行重建,绕过PE文件地址随机化,方便逆向时地址的分析

    概率与随机化算法_钟诚.pptx

    概率与随机化算法是计算机科学中的重要分支,它在解决复杂问题时往往能提供有效的方法。从提供的部分内容来看,我们可以探讨几个与概率和随机化算法相关的知识点。 首先,历史上的概率概念源于赌博游戏,比如一个...

    随机化算法实验(Sherwood型线性时间选择).docx

    随机化算法实验(Sherwood型线性时间选择) 本次实验的主要目的是掌握 Sherwood 型线性时间选择算法的设计思想、程序设计和实现。 Sherwood 型线性时间选择算法是一种随机化算法,通过随机选择基准元素来实现选择...

    PRB随机化策略优化案例.doc

    PRB随机化策略优化案例.doc

    数组随机化的java语言实现

    数组随机化的算法,减小了时间复杂度,变成了O(n)。使用了Java语言

    随机化算法

    本资源是从众多学生中选取出来的...其中包含了逆矩阵问题,工作安排,集合相等问题等5个基于随机化算法算法的实现,每个范例都有详尽代码和算法分析PPT! 其他基于随机化算法问题都可以参考本范例,是学习的绝佳材料。

    01.孟德尔·随机化R软件.php

    01.孟德尔·随机化R软件.php

    基于指令集随机化的SQL注入防御技术研究.pdf

    基于指令集随机化的SQL注入防御技术研究.pdf

    10.刘家骅《浅谈随机化在信息学竞赛中的应用》.ppt

    10.刘家骅《浅谈随机化在信息学竞赛中的应用》.ppt

    SystemVerilog 中的随机化激励.pdf

    ### SystemVerilog中的随机化激励 #### 一、引言 随着集成电路设计复杂度的不断上升,验证工作面临着前所未有的挑战。为了确保设计的正确性和可靠性,在设计阶段就需要进行全面且有效的验证。传统的验证方法往往...

Global site tag (gtag.js) - Google Analytics