伪随机值的概率

计算伪随机值的概率

耿祥义

摘 要

通过一些熟悉的场景,为初学者讲解一些重要的知识点,利用过去没有的条件,比如微信公众号,提供一些有趣的实例作为教材的课外读物,帮助学习者提高学习效果。

一 、重要知识点

Random类以及HashMap类。HashMap类的对象可以存放“键值对”数据,键不可重复。即如果HashMap对象已经有键值对数据,如果再向其添加,HashMap对象将清除先前的键值对数据

算法得到的随机值称作伪随机值,生活中,例如抛扔硬币看正反面获得的值称作真随机值。java.util包中的Random类可以帮助获得随机值(伪随机值)。例如,nextInt(m)随机返回0到m-1中的某个整数(伪随机值)。如果m取值2,每次调用nextInt(2)相当于模拟抛钢镚硬币。那么我们就可以编程练习计算这样的问题:调用nextInt(2)方法10000次(样本空间的大小是10000),nextInt(2)得到伪随机值0的概率以及nextInt(2)得到伪随机值1的概率是多少?按概率论的理论,随着样本空间的增大,二者的概率应该都接近0.5(Random类设计的算法使得伪随机值的概率符合真随机值的概率)。当然,可以计算nextInt(m)得到的伪随机值0,1,2,...m-1的概率,随着样本空间的增大,nextInt(m)得到的伪随机值0,1,2,...m-1的概率都趋近1/m。

二、程序效果图

三、代码下载

https://share.weiyun.com/5RVf0GV

四、在线阅读

MainClass.java

import java.util.Arrays;

public class MainClass {

public static void main(String args[]){

VerificationRandom verification =

new Verification();

int samples = 100000;//样本空间大小

verification.setSamples(samples);

//返回0至m伪随机数的概率:

int m =10;

double probability[] =

verification.verificationRandom(m);

("样本空间大小"+samples);

("得到0至"+m+"伪随机数的概率");

double sum = 0;

for(double d:probability){

sum += d;

}

Arrays.sort(probability);

("最大概率:"+probability[probability.length-1]);

("最小概率:"+probability[0]);

}

}

IntegerFrequency .java

public class IntegerFrequency {

private int number;

private int count; //number出现的次数

public void setNumber(int m){

number = m;

}

public int getNumber(){

return number;

}

public void setCount(int m){

count = m;

}

public int getCount(){

return count;

}

}

VerificationRandom .java

public interface VerificationRandom {

public void setSamples(int m);//设置样本空间大小

public double [] verificationRandom(int m);

//验证0至m(不包括m)出现的概率是否符合真随机数出的概率

}

VerificationRandom .java

import java.util.Random;

import java.util.HashMap;

public class Verification

implements VerificationRandom{

//存放键值对:键是String,值是IntegerFrequency:

HashMap map;

Random random;

int samples =1000;//样本数

Verification(){

map =

new HashMap();

random = new Random();

}

public void setSamples (int m){

samples = m;

}

public double [] verificationRandom(int m){

double probability[];//存放数字出现的概率

probability = new double[m];

for(int i = 0;i

int n = random.nextInt(m);

IntegerFrequency number =

new IntegerFrequency();

number.setNumber(n);

if(map.containsKey(""+n)){

IntegerFrequency isSave =

map.get(""+n);

isSave.setCount(isSave.getCount()+1);

}

else {

map.put(""+n,number); //散列映射添加键值对

}

}

int k = 0;

while(k

if(map.containsKey(""+k)) {

IntegerFrequency n = map.get(""+k);

int count = n.getCount();

double frequency =

(double)count/samples;

probability[k] = frequency;

}

k++;

}

return probability;

}

}

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200414A0D8OT00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券