`
- 浏览:
23158 次
- 性别:
- 来自:
珠海
-
慢慢开始有感觉数学对写程序有很多影响.真后悔上上学期的离散数学和概率老是逃课!!
拜读了云风老大的"泊松分布"联想到要有较好的数学和概率基础才能搞出所谓的随机化算法.
搞一个例子吧:
泊松分布一般适用于发生一次的概率很小事件.例如:一门很容易的考试,结果还是有一两个不及格(失礼了,小弟曾经是其中一个.),还有比如购买彩票等等事件,中奖概率很小的事件.假如中奖概率为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
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
《论随机化算法的原理与设计》这篇论文由上海市控江中学的周咏基撰写,主要探讨了随机化算法的概念、设计方法及其在信息学问题解决中的应用。随机化算法是一种利用随机函数影响算法执行流程或结果的策略,其有效性并...
为了避免这种情况,提出了随机化快速排序的概念。 随机化快速排序在选择基准元素时引入随机性,使得算法的效率不依赖于输入序列的顺序,从而保证了算法的平均效率。其期望的运行时间复杂度为Θ(nlogn)。在随机化...
【随机化算法在信息学竞赛中的应用】 随机化算法,作为一种新兴且独特的算法,近年来在信息学竞赛中逐渐崭露头角。随着竞赛题目日益复杂,新型算法不断涌现,掌握随机化算法对于参赛者而言,意味着拥有了更多解决...
在IT领域,算法是解决问题的核心工具,而递归与分治策略、动态规划、贪心算法、回溯法、分支限界法以及随机化算法都是其中的重要组成部分。这些算法不仅适用于计算机科学,也在数据结构、优化问题和复杂计算中扮演着...
基于 Linux 地址空间随机化的缓冲区溢出研究 本研究论文主要探讨了缓冲区溢出攻击在 Linux 系统下的防御方法,特别是通过地址空间随机化技术来防御缓冲区溢出攻击。_paper首先分析了缓冲区溢出攻击的原理,然后讨论...
通过修改分析PE文件中的属性,修改地址随机化标志,并对PE文件进行重建,绕过PE文件地址随机化,方便逆向时地址的分析
概率与随机化算法是计算机科学中的重要分支,它在解决复杂问题时往往能提供有效的方法。从提供的部分内容来看,我们可以探讨几个与概率和随机化算法相关的知识点。 首先,历史上的概率概念源于赌博游戏,比如一个...
随机化算法实验(Sherwood型线性时间选择) 本次实验的主要目的是掌握 Sherwood 型线性时间选择算法的设计思想、程序设计和实现。 Sherwood 型线性时间选择算法是一种随机化算法,通过随机选择基准元素来实现选择...
PRB随机化策略优化案例.doc
数组随机化的算法,减小了时间复杂度,变成了O(n)。使用了Java语言
本资源是从众多学生中选取出来的...其中包含了逆矩阵问题,工作安排,集合相等问题等5个基于随机化算法算法的实现,每个范例都有详尽代码和算法分析PPT! 其他基于随机化算法问题都可以参考本范例,是学习的绝佳材料。
01.孟德尔·随机化R软件.php
基于指令集随机化的SQL注入防御技术研究.pdf
10.刘家骅《浅谈随机化在信息学竞赛中的应用》.ppt
### SystemVerilog中的随机化激励 #### 一、引言 随着集成电路设计复杂度的不断上升,验证工作面临着前所未有的挑战。为了确保设计的正确性和可靠性,在设计阶段就需要进行全面且有效的验证。传统的验证方法往往...