本文实例为大家分享了 Java 随机数生成代码 , 供大家参考 , 具体内容如下
package com.gonvan.common.utils; import java.util. *; / ** * 随机数工具 * * @author yuerzm * * / public Final Class LotteRyaliasMethod {/ ** * Le générateur de nombres aléatoires utilisé pour échantillonner à partir de la distribution. * / aléatoire final privé aléatoire; / ** * Les tables d'alias. * / private final int [] alias; / ** * Les tables de probabilité. * / Probabilité du double final privé; / ** * Construit un nouvel aliasmethod pour échantillonner à partir d'une distribution discrète et * des résultats de retour en fonction de la distribution de probabilité. * <p /> * donné comme entrée une liste de probabilités correspondant aux résultats 0, 1, * ..., n - 1, ce constructeur crée les tables de probabilité et d'alias * nécessaires pour échantillonner efficacement à partir de cette distribution. * * @param Probabilités * La liste des probabilités. * / public loteAlIaSMethod (list <rouble> probabilités) {this (probabilités, new random ()); } / ** * Construit un nouvel aliasmethod à échantillonner à partir d'une distribution discrète et * des résultats de retour en fonction de la distribution de probabilité. * <p /> * donné comme entrée une liste de probabilités correspondant aux résultats 0, 1, * ..., n - 1, avec le générateur de nombres aléatoires qui doit être utilisé comme * le générateur sous-jacent, ce constructeur crée la probabilité et * les tables d'alias nécessaires pour échantillonner efficacement à partir de cette distribution. * * @param Probabilités * La liste des probabilités. * @param aléatoire * Le générateur de nombres aléatoires * / public LoteAlIaSMethod (list <rouble> probabilités, aléatoire aléatoire) {/ * Commencez par effectuer des vérifications structurelles de base sur les entrées. * / if (probabilités == null || random == null) lancez new nullpointerException (); if (probabilities.size () == 0) lancer un nouveau IllégalArgumentException ("Le vecteur de probabilité doit être non vide."); / * Allouer de l'espace pour les tables de probabilité et d'alias. * / probabilité = nouveau double [probabilités.size ()]; alias = new int [probabilities.size ()]; / * Stockez le générateur sous-jacent. * / this.random = aléatoire; / * Calculez la probabilité moyenne et mettez-le pour une utilisation ultérieure. * / moyenne double finale = 1,0 / probabilités.size (); / * * Faire une copie de la liste des probabilités, car nous apporterons * des modifications. * / probabilités = new ArrayList <back> (probabilités); / * Créez deux piles pour agir en tant que listes de travail car nous remplissons les tables. * / DEQUE <Anteger> small = new ArrayDeque <Integer> (); Deque <Integer> Large = new ArrayDeque <Neger> (); / * Remplissez les piles avec les probabilités d'entrée. * / for (int i = 0; i <probabilities.size (); ++ i) {/ * * Si la probabilité est inférieure à la probabilité moyenne, alors nous l'ajoutons * à la petite liste; Sinon, nous l'ajoutons à la grande liste. * / if (probabilities.get (i)> = moyen) grand.add (i); else small.add (i); } / * * En tant que note: dans la spécification mathématique de l'algorithme, nous * épuiserons toujours la petite liste avant la grande liste. Cependant, * en raison des inexactitudes des points flottants, ce n'est pas nécessairement vrai. * Par conséquent, cette boucle intérieure (qui essaie d'associer les petits et les grands éléments) devra vérifier que les deux listes ne sont pas vides. * / while (! small.isempty () &&! Large.iSempty ()) {/ * Obtenez l'indice des petites et grandes probabilités. * / int boins = small.removelast (); int plus = grand.removelast (); / * * Ces probabilités n'ont pas encore été mises à l'échelle pour être telles que * 1 / n reçoit le poids 1.0. Nous le faisons ici à la place. * / probabilité [moins] = probabilités.get (moins) * probabilités.size (); alias [moins] = plus; / * * Diminuez la probabilité de la plus grande par la quantité appropriée *. * / probabilités.set (plus, (probabilités.get (plus) + probabilités.get (moins)) - moyenne); / * * Si la nouvelle probabilité est inférieure à la moyenne, ajoutez-la dans la * petite liste; Sinon, ajoutez-le à la grande liste. * / if (probabilities.get (plus)> = 1.0 / probabilities.size ()) grand.add (plus); else small.add (plus); } / * * À ce stade, tout se trouve dans une liste, ce qui signifie que les * probabilités restantes doivent être toutes 1 / n. Sur la base de cela, définissez-les * de manière appropriée. En raison de problèmes numériques, nous ne pouvons pas être sûrs de laquelle * pile tiendra les entrées, nous vidons donc les deux. * / while (! small.isempty ()) probabilité [small.removelast ()] = 1,0; while (! Large.Isempty ()) Probabilité [grand.removelast ()] = 1,0; } / ** * Échantillonne une valeur de la distribution sous-jacente. * * @return une valeur aléatoire échantillonnée à partir de la distribution sous-jacente. * / public int next () {/ * Générez un jet de matrice équitable pour déterminer la colonne à inspecter. * / int colonnes = random.nextint (probabilité.length); / * Générez un lancer de monnaie biaisé pour déterminer l'option à choisir. * / boolean cointoss = random.nextDouble () <probabilité [colonne]; / * En fonction du résultat, renvoyez la colonne ou son alias. * / retour COINTOSS? colonne: alias [colonne]; }}以上就是本文的全部内容 , 希望对大家的学习有所帮助。