本文实例为大家分享了 Java 随机数生成代码 供大家参考 , 具体内容如下
пакет com.gonvan.common.utils; Импорт java.util.*; /** * 随机数工具 * * @author yuerzm * * /public final Class lotteryaliasmethod { /** * генератор случайных чисел, используемый для выборки из распределения. */ private final Random Random; /*** Таблицы псевдонима. */ private final int [] псевдоним; /*** Таблицы вероятностей. */ private final double [] вероятность; /** * Создает новый AliasMethod для выборки из дискретного распределения и * ручных результатов на основе распределения вероятностей. * <p/> * Приведен в качестве ввода Список вероятностей, соответствующих результатам 0, 1, * ..., n - 1, этот конструктор создает вероятность и таблицы псевдонима *, необходимые для эффективного выбора из этого распределения. * * @param вероятности * Список вероятностей. */ public lotteryaliasmethod (list <way> вероятности) {this (вероятность, new random ()); } /** * Конструирует новый псевдоним для выборки из дискретного распределения и * ручных результатов на основе распределения вероятностей. * <p/> * Приведен в качестве ввода Список вероятностей, соответствующих результатам 0, 1, * ..., n - 1, вместе со случайным генератором чисел, который следует использовать в качестве * основного генератора, этот конструктор создает вероятность и * таблицы псевдонима, необходимые для эффективного образца из этого распределения. * * @param вероятности * Список вероятностей. * @param случайный * генератор случайных чисел * / public lotteryaliasmethod (list <double> Вероятности, случайные случайные) { / * Начните с проведения основных структурных проверок на входах. */ if (вероятности == null || random == null) бросить новый NullPointerException (); if (вероятность.size () == 0) бросить новый allosalargumentException («Вектор вероятности должен быть непусты».); /* Выделите пространство для таблиц вероятности и псевдонимов. */ вероятность = новая двойная [вероятности.size ()]; псевдоним = new int [вероятности.size ()]; /* Храните базовый генератор. */ this.random = random; /* Вычислите среднюю вероятность и кэшируйте ее для последующего использования. * / окончательный двойной средний = 1,0 / вероятность.size (); / * * Сделайте копию списка вероятностей, поскольку мы будем вносить в него * изменения. */ вероятности = новый ArrayList <wound> (вероятности); /* Создайте два стека, чтобы действовать в качестве рабочих списков, когда мы заполняем таблицы. */ Deque <Integer> small = new Arraydeque <Integer> (); Deque <Integer> large = new Arraydeque <Integer> (); /* Заполните стеки с входными вероятностями. * / for (int i = 0; i <вероятность.size (); ++ i) { / * * Если вероятность ниже средней вероятности, то мы добавляем * его в маленький список; В противном случае мы добавляем его в большой список. */ if (вероятности.get (i)> = среднее) large.add (i); еще Small.add (i); } / * * В качестве примечания: в математической спецификации алгоритма мы * всегда будем исчерпывать небольшой список перед большим списком. Однако * из -за неточностей с плавающей запятой, это не обязательно верно. * Следовательно, этот внутренний цикл (который пытается соединить небольшие и большие * элементы), должен проверить, что оба списка не пусты. * / while (! small.isempty () &&! large.isempty ()) { /* Получить индекс малых и больших вероятностей. */ int mess = small.removelast (); int more = large.removelast (); / * * Эти вероятности еще не были масштабированы, чтобы быть такими, что * 1/n получают вес 1,0. Вместо этого мы делаем это здесь. */ Вероятность [меньше] = вероятности.get (меньше) * Вероятности.size (); псевдоним [меньше] = больше; / * * Уменьшите вероятность большего на соответствующую * сумму. */ вероятности.set (больше, (вероятности.get (больше) + вероятности. Get (LIS)) - среднее); / * * Если новая вероятность меньше, чем в среднем, добавьте ее в маленький список; В противном случае добавьте его в большой список. * / if (вероятности.get (more)> = 1,0 / вероятности. иначе Small.add (подробнее); } / * * На данный момент все находится в одном списке, что означает, что оставшиеся вероятности должны быть 1 /n. Основываясь на этом, установите их * соответствующим образом. Из -за численных проблем мы не можем быть уверены, какой * стек содержит записи, поэтому мы опустошим оба. */ while (! small.isempty ()) вероятность [small.removelast ()] = 1,0; while (! large.isempty ()) вероятность [lags.removelast ()] = 1,0; } /*** Образцы значения из базового распределения. * * @return Случайное значение, отобранное из базового распределения. * / public int next () { /* Сгенерировать справедливую рулону, чтобы определить, какой столбец проверить. */ int column = random.nextint (вероятность.length); /* Создайте смещенную монету, чтобы определить, какой вариант выбрать. */ boolean cointoss = random.nextdouble () <вероятность [Column]; /* На основании результата верните либо столбец, либо его псевдоним. */ вернуть cointoss? столбец: псевдоним [Column]; }}以上就是本文的全部内容 , 希望对大家的学习有所帮助。