计算伪随机值的概率
耿祥义
摘 要
通过一些熟悉的场景,为初学者讲解一些重要的知识点,利用过去没有的条件,比如微信公众号,提供一些有趣的实例作为教材的课外读物,帮助学习者提高学习效果。 一 、重要知识点 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); System.out.println ("样本空间大小"+samples); System.out.println ("得到0至"+m+"伪随机数的概率"); System.out.println(Arrays.toString(probability)); double sum = 0; for(double d:probability){ sum += d; } System.out.println("概率和:"+sum); Arrays.sort(probability); System.out.println ("最大概率:"+probability[probability.length-1]); System.out.println ("最小概率:"+probability[0]); } }IntegerFrequency .java
public class IntegerFrequency { private int number; private int count; //number出现的次数 public void setNumber(int m){ if(m>=0) number = m; } public int getNumber(){ return number; } public void setCount(int m){ if(m>=0) 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; } } 推荐阅读枚举类型与交通信号灯
HashSet集合的一些特殊情况