计算伪随机值的概率
耿祥义
摘 要
通过一些熟悉的场景,为初学者讲解一些重要的知识点,利用过去没有的条件,比如微信公众号,提供一些有趣的实例作为教材的课外读物,帮助学习者提高学习效果。
一 、重要知识点
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;
}
}
领取专属 10元无门槛券
私享最新 技术干货