如何在程序中产生概率性的结果

简介:

最近遇到一个有趣的需求,大概意思就是:编写一个方法,其输出是true或者false,并且该方法调用量很大,我们无法预测每次调用该方法究竟会产生什么结果,但产生true的概率是(或者说非常接近)预先设定好的(比如20%)。
 

为了实现这个需求,可以采取这样一种思路:

1,建立一个BitSet,size设为100。然后随机产生X个下标,然后将这些下标对应的位置设为true。 

2,每次调用该方法时,再产生一个随机数作为下标,然后以此下标取得bitset中指定位置的值,返回。

下面贴一个Java的实现:
 

首先是产生指定个数的随机下标,TreeSet的一个良好特性就是对于重复的元素,将不会被加入其中

 
 
  1. private List<Integer> makeRndNumbers(int count, int boundry) {  
  2.     TreeSet<Integer> set = new TreeSet<Integer>();  
  3.     while(set.size() < count) {  
  4.         set.add(Math.abs(secRandom.nextInt()) % boundry);  
  5.     }  
  6.       
  7.     return new ArrayList<Integer>(set);  

 假设这个类命名为PercentChoice,其构造方法如下,这里使用了SecureRandom类,这是Java内置的一个安全的随机数发生器。

 
 
  1. public PercentChoice(int percentage) {  
  2.     try {  
  3.         secRandom = SecureRandom.getInstance("SHA1PRNG");  
  4.         secRandom.setSeed(System.currentTimeMillis());  
  5.     } catch (NoSuchAlgorithmException e) {  
  6.         e.printStackTrace();  
  7.     }  
  8.       
  9.     for(Integer i : makeRndNumbers(percentage, 100)) {  
  10.         bitSet.set(i, true);  
  11.     }  

这个方法的代码就非常容易了

 
 
  1. public boolean getOneChoice() {  
  2.     return bitSet.get(Math.abs(secRandom.nextInt()) % 100);  

最后写个测试的方法

 
 
  1. public static void main(String[] args) throws InterruptedException {  
  2.     PercentChoice pc = new PercentChoice(20);  
  3.     int hits = 0;  
  4.     int times = 10000;  
  5.     for(int i = 0; i < times; i++) {  
  6.         if(pc.getOneChoice()) {  
  7.             hits++;  
  8.         }  
  9.     }  
  10.     System.out.println("Hits percentage " + (double)hits * 100 / (double)times + " %");  

在我的机器上反复运行这个测试,其实验结果总是在20%的左右抖动,代码完全满足了需求。










本文转自 kevx 51CTO博客,原文链接:http://blog.51cto.com/spinlock/447867,如需转载请自行联系原作者
目录
相关文章
|
6天前
|
Windows
R语言有状态依赖强度的非线性、多变量跳跃扩散过程模型似然推断分析股票价格波动
R语言有状态依赖强度的非线性、多变量跳跃扩散过程模型似然推断分析股票价格波动
|
6天前
|
算法 定位技术
插值、平稳假设、本征假设、变异函数、基台、块金、克里格、线性无偏最优…地学计算概念及公式推导
插值、平稳假设、本征假设、变异函数、基台、块金、克里格、线性无偏最优…地学计算概念及公式推导
|
6月前
【概率論】常用專業名詞中韓對照表 | 확률론 한중 번역표
【概率論】常用專業名詞中韓對照表 | 확률론 한중 번역표
36 0
|
11月前
|
数据挖掘
假设检验多重比较的P值修正
在进行假设检验时,我们通常会使用P值来判断样本数据是否支持原假设。当我们进行多重比较时,也就是对多个假设进行检验时,如果不进行P值修正,就会出现多重比较问题。多重比较问题指的是在进行多次假设检验时,由于进行多次检验,就会增加发生假阳性的概率,从而导致P值的误判。这种误判可能会导致我们错误地拒绝原假设或者错误地接受备择假设,从而影响数据分析的准确性和可靠性。为了避免多重比较问题,进行P值修正可以有效地避免多重比较问题的发生。
384 0
|
资源调度 算法 关系型数据库
概率图推断之变量消除算法
事实证明,推理是一项颇具挑战的任务。对于很多我们感兴趣的概率,要准确回答这些问题都是NP难题。至关重要的是,推理是否容易处理取决于描述概率的图的结构。尽管有些问题很难解决,我们仍然可以通过近似推理方法获得有用的答案。
194 0
概率图推断之变量消除算法
torch中对一个行向量使用sigmoid函数转换成概率,如果这个行向量包含的元素有几千上万个,这可能会导致转换成的概率再抽样效果不好,应该怎么解决这个问题
可以尝试使用softmax函数进行转换,它可以处理具有多个值的行向量,并将其转换为概率分布。另外,可以考虑使用截断技术(如Top-K),减少概率中过小的部分,以提高采样效果。
100 0
|
人工智能 移动开发 BI
概率论<一>——随机事件与概率(二)
概率论<一>——随机事件与概率
概率论<一>——随机事件与概率(二)
M*M贝叶斯统计问题的蒙特卡洛模拟的解决方法
M*M贝叶斯统计问题的蒙特卡洛模拟的解决方法
60 0
M*M贝叶斯统计问题的蒙特卡洛模拟的解决方法
|
Python
100道单选题,随机选,考够60分的概率有多高?
100道单选题,随机选,考够60分的概率有多高?
176 0