本文实例为大家分享了java随机数生成代码,供大家参考,具体内容如下
包com.gonvan.common.utils;导入Java.util。*; /** * * * * * @author yuerzm * * /公共最终类LotteryaliasMethod { /** *用于从分布中采样的随机数生成器。 */私人最终随机随机; /***别名表。 */ private final int []别名; /***概率表。 */私人最终双[]概率; /** *根据概率分布构建了一种从离散分布中采样的新别秒示例,并 *手动退回结果。 * <p/> *作为输入给出的概率列表,与结果相对应0、1, * ...,n -1,此构造函数创建了从此分布中有效采样所需的概率和别名表 *。 * * @param概率 *概率列表。 */ public lotteryaliasmethod(list <double>概率){this(概率,new Random()); } /** *根据概率分布从离散分布中构建一个新的别名术,从离散分布中样本和 *手动恢复结果。 * <p/> *作为输入给出的概率列表,与结果相对应的概率列表, *, * ...,n -1,以及应用作 *基础生成器的随机数生成器,该构造函数创建了有效地从该分布中进行采样所需的概率和 *别名表。 * * @param概率 *概率列表。 * @param随机 *随机数生成器 * / public lotteryaliasmethod(list <double>概率,随机随机){ / *开始对输入进行基本的结构检查。 */ if(probabilities == null || random == null)抛出新的nullpointerexception();如果(promabilities.size()== 0)抛出新的illegalargumentException(“概率向量必须是非空的。”); /*为概率和别名表分配空间。 */概率= new double [probabilities.size()]; alias = new Int [Probibilities.size()]; /*存储基础发电机。 */ this.random = random; /*计算平均概率并缓存以供以后使用。 * /最终双平均值= 1.0 / promabilities.size(); / * *制作概率列表的副本,因为我们将对其进行 *更改。 */概率= new ArrayList <double>(概率); /*创建两个堆栈以在我们填充表时充当工作清单。 */ deque <integer> small = new Arraydeque <integer>(); Deque <integer> grine = new Arraydeque <integer>(); /*使用输入概率填充堆栈。 * / for(int i = 0; i <probabilities.size(); ++ i){ / * *如果概率低于平均概率,则我们将 *添加到小列表中;否则,我们将其添加到大列表中。 */ if(probabilities.get(i)> =平均)大add(i);否则小add(i); } / * *作为注意:在算法的数学规范中,我们 *将始终在大列表之前用尽小列表。但是, *由于浮点不准确,这不一定是正确的。 *因此,这个内部循环(尝试配对大小元素)将不得不检查两个列表都不为空。 * / while(!small.isempty()&&! */ int lys = small.removelast(); int more = ligal.removelast(); / * *这些概率尚未扩大到使 * 1/n的重量1.0。我们在这里做到这一点。 */概率[lims] = promabilities.get(lims) * probibilities.size();别名[LINS] = MORE; / * *通过适当的 *降低较大的概率。 */ probabilities.set(更多,(probabilities.get(more) + probabilities.get(lys)) - 平均值); / * *如果新概率小于平均值,则将其添加到 *小列表中;否则将其添加到大列表中。 * / if(probabilities.get(more)> = 1.0 / probabilities.size())否则小add(更多); } / * *在这一点上,所有内容都在一个列表中,这意味着 *剩余的概率应为1 /n。基于此,将它们 *适当地设置。由于数值问题,我们无法确定哪个 *堆栈将保存条目,因此我们两者都清空。 */ while(!small.isempty())概率[small.removelast()] = 1.0;而(! } /***从基础分布中采样一个值。 * * @return从基础分布中采样的随机值。 * / public int next(){ /*生成一个公平的模具卷以确定要检查哪个列。 */ int column = random.nextint(probinality.length); /*生成一个有偏见的硬币折腾,以确定选择哪种选项。 */ boolean cointoss = random.nextDouble()<概率[列]; /*基于结果,返回列或别名。 */返回COINTOSS?列:别名[列]; }}}以上就是本文的全部内容,希望对大家的学习有所帮助。,希望对大家的学习有所帮助。