本文实例为大家分享了 java 随机数生成代码 , 供大家参考 具体内容如下
paquete com.gonvan.common.utils; import java.util.*; /** * 随机数工具 * * @Author Yuerzm * * /public Final Class LotteryAliasmethod { /** * El generador de números aleatorios utilizado para probar desde la distribución. */ Privado final al azar al azar; /*** Las tablas de alias. */ private final int [] alias; /*** Las tablas de probabilidad. */ Probabilidad privada final Doble []; /** * Construye un nuevo aliasmetod para probar a partir de una distribución discreta y * retrocede los resultados basados en la distribución de probabilidad. * <p /> * Dada como entrada Una lista de probabilidades correspondientes a los resultados 0, 1, * ..., n - 1, este constructor crea la probabilidad y las tablas de alias * necesarias para probar eficientemente de esta distribución. * * @param probabilidades * La lista de probabilidades. */ public lotteryaliasmethod (list <doble> probabilidades) {this (probabilidades, new Random ()); } /** * Construye un nuevo aliasmetod para muestrear a partir de una distribución discreta y * los resultados de la mano basada en la distribución de probabilidad. * <p /> * Dada como entrada una lista de probabilidades correspondientes a los resultados 0, 1, * ..., n - 1, junto con el generador de números aleatorios que debe usarse como * el generador subyacente, este constructor crea la probabilidad y * las tablas de alias necesarias para probar eficientemente esta distribución. * * @param probabilidades * La lista de probabilidades. * @param Random * El generador de números aleatorios * / public lotteryaliasmethod (list <doble> probabilidades, aleatorias aleatorias) { / * Comience haciendo verificaciones estructurales básicas en las entradas. */ if (probabilidades == null || aleator == null) tirar nueva nullpointerException (); if (probabilidades.size () == 0) tirar nueva ilegalargumentException ("El vector de probabilidad no debe estar vacío"); /* Asignar espacio para las tablas de probabilidad y alias. */ probabilidad = new Double [probabilidades.size ()]; alias = new int [probabilidades.size ()]; /* Almacene el generador subyacente. */ this.random = random; /* Calcule la probabilidad promedio y caché para su uso posterior. * / final Double promedio = 1.0 / probabilidades.size (); / * * Haga una copia de la lista de probabilidades, ya que haremos * cambios en ella. */ probabilidades = new ArrayList <So Double> (probabilidades); /* Crear dos pilas para actuar como listas de trabajo mientras llenamos las tablas. */ Deque <integer> small = new ArrayDeque <integer> (); Deque <integer> grande = new ArrayDeque <integer> (); /* Puega las pilas con las probabilidades de entrada. * / for (int i = 0; i <probabilidades.size (); ++ i) { / * * Si la probabilidad está por debajo de la probabilidad promedio, entonces la agregamos * a la pequeña lista; De lo contrario, lo agregamos a la lista grande. */ if (probabilidades.get (i)> = promedio) grande.add (i); else Small.add (i); } / * * Como nota: en la especificación matemática del algoritmo, * siempre agotaremos la pequeña lista antes de la gran lista. Sin embargo, * Debido a las imprecisiones de puntos flotantes, esto no es necesariamente cierto. * En consecuencia, este bucle interno (que trata de emparejar elementos pequeños y grandes *) tendrá que verificar que ambas listas no estén vacías. * / while (! Small.isEmpty () &&! Lig.isEmpty ()) { /* Obtenga el índice de las probabilidades pequeñas y grandes. */ int menos = small.removelast (); int más = grande.removelast (); / * * Estas probabilidades aún no se han reducido para ser tales que * 1/n recibe peso 1.0. Hacemos esto aquí en su lugar. */ probabilidad [menos] = probabilidades.get (menos) * probabilidades.size (); alias [menos] = más; / * * Disminución de la probabilidad de la más grande por la cantidad apropiada *. */ probabilidades.set (más, (probabilidades.get (más) + probabilidades.get (menos)) - promedio); / * * Si la nueva probabilidad es menor que el promedio, agrégalo a la * pequeña lista; de lo contrario, agréguelo a la lista grande. * / if (probabilidades.get (más)> = 1.0 / probabilidades.size ()) grande.add (más); else Small.Add (más); } / * * En este punto, todo está en una lista, lo que significa que * las probabilidades restantes deberían ser 1 /n. Basado en esto, configúalos * apropiadamente. Debido a problemas numéricos, no podemos estar seguros de qué * Stack sostendrá las entradas, por lo que vacíos ambos. */ while (! Small.isEmpty ()) probabilidad [small.removelast ()] = 1.0; while (! grande.isEmpty ()) probabilidad [grande.removelast ()] = 1.0; } /*** Muestra un valor de la distribución subyacente. * * @return Un valor aleatorio muestreado de la distribución subyacente. * / public int Next () { /* Genere un rollo de matriz justo para determinar qué columna inspeccionar. */ int columna = random.nextint (probabilidad.length); /* Genere un lanzamiento de monedas sesgadas para determinar qué opción elegir. */ boolean cointoss = random.nextDouble () <probabilidad [columna]; /* Basado en el resultado, devuelva la columna o su alias. */ return cointoss? columna: alias [columna]; }}以上就是本文的全部内容 希望对大家的学习有所帮助。 希望对大家的学习有所帮助。