Java 随机数生成代码 , 供大家参考 , 具体内容如下
pacote com.gonvan.common.utils; importar java.util.*; /** * 随机数工具 * * @author yuerzm * * /public Final Class LotteryaliasMethod { /** * O gerador de números aleatórios usado para amostrar a partir da distribuição. */ Random -aleatório final privado; /*** As tabelas de alias. */ private final int [] alias; /*** As tabelas de probabilidade. */ Private Final Double Double [] Probabilidade; /** * Construa um novo aliasmethod para amostrar a partir de uma distribuição discreta e * devolver os resultados com base na distribuição de probabilidade. * <p/> * Dado como entrada uma lista de probabilidades correspondentes aos resultados 0, 1, * ..., n - 1, este construtor cria as tabelas de probabilidade e alias * necessários para amostrar com eficiência a partir desta distribuição. * * @param Probabilidades * A lista de probabilidades. */ Public LotteryaliasMethod (LIST <Houble> Probabilidades) {this (probabilidades, new Random ()); } /** * Construa um novo aliasmethod para amostrar a partir de uma distribuição discreta e * devolver os resultados com base na distribuição de probabilidade. * <P/> * Dado como entrada uma lista de probabilidades correspondentes aos resultados 0, 1, * ..., n - 1, juntamente com o gerador de números aleatórios que devem ser usados como * o gerador subjacente, esse construtor cria as tabelas de probabilidade e * alias necessárias para amostra com eficiência a partir desta distribuição. * * @param Probabilidades * A lista de probabilidades. * @param aleatório * O gerador de números aleatórios * / public lotteryaliasMethod (List <boun> probabilidades, aleatória aleatória) { / * Comece fazendo verificações estruturais básicas nas entradas. */ if (probabilidades == null || aleatoriamente == null) lança novo nullPointerException (); if (probabilities.size () == 0) lançar novas ilegalArgumentException ("O vetor de probabilidade deve estar não vazio."); /* ALOCAR ESPAÇO PARA AS TABELAS DE PROBABILIDADE E ALIAS. */ probabilidade = novo duplo [probabilities.size ()]; alias = new int [probabilidades.size ()]; /* Armazene o gerador subjacente. */ this.random = aleatório; /* Calcule a probabilidade média e cache para uso posterior. * / média dupla final = 1,0 / probabilidades.size (); / * * Faça uma cópia da lista de probabilidades, pois faremos * alterações. */ Probabilidades = novo ArrayList <Poun> (probabilidades); /* Crie duas pilhas para atuar como listas de trabalho enquanto povoamos as mesas. */ Deque <Teger> small = new ArrayDeque <Teger> (); Deque <Teger> grande = new ArrayDeque <Teger> (); /* Preencha as pilhas com as probabilidades de entrada. * / for (int i = 0; i <probabilidades.size (); ++ i) { / * * Se a probabilidade estiver abaixo da probabilidade média, adicionamos * a * a pequena lista; Caso contrário, o adicionamos à grande lista. */ if (probabilidades.get (i)> = média) grande.add (i); else small.add (i); } / * * Como uma nota: Na especificação matemática do algoritmo, nós * sempre esgotaremos a pequena lista antes da grande lista. No entanto, * devido a imprecisões de ponto flutuante, isso não é necessariamente verdadeiro. * Consequentemente, esse loop interno (que tenta emparelhar pequenos e grandes elementos * terá que verificar se as duas listas não estão vazias. * / while (! small.isEmpty () &&! Large.isEmpty ()) { /* Obtenha o índice das pequenas e grandes probabilidades. */ int menos = small.removelast (); int mais = grande.removelast (); / * * Essas probabilidades ainda não foram escaladas para ser tal que * 1/n recebe peso 1.0. Em vez disso, fazemos isso aqui. */ probabilidade [menos] = probabilidades.get (menos) * probabilidades.size (); Alias [menos] = mais; / * * Diminua a probabilidade do maior pela quantidade apropriada *. */ probabilidades.set (mais, (probabilidades.get (mais) + probabilidades.get (menos)) - média); / * * Se a nova probabilidade for menor que a média, adicione -a na * Lista pequena; Caso contrário, adicione -o à grande lista. * / if (probabilidades.get (mais)> = 1.0 / probabilidades.size ()) grande.add (mais); else pequeno.Add (mais); } / * * Neste ponto, tudo está em uma lista, o que significa que as * probabilidades restantes devem ser 1 /n. Com base nisso, defina -os * adequadamente. Devido a problemas numéricos, não podemos ter certeza de qual * pilha manterá as entradas, por isso esvaziamos os dois. */ while (! small.isempty ()) probabilidade [small.removelast ()] = 1.0; while (! Large.IsEmpty ()) probabilidade [LIME.Removelast ()] = 1.0; } /*** Amostras de um valor da distribuição subjacente. * * @return Um valor aleatório amostrado da distribuição subjacente. * / public int next () { /* Gere um rolo de matriz justa para determinar qual coluna inspecionar. */ int colun = aleatom.nextInt (probability.length); /* Gere um lançamento de moeda tendencioso para determinar qual opção escolher. */ boolean cointoss = random.nextDouble () <probabilidade [coluna]; /* Com base no resultado, retorne a coluna ou seu alias. */ Return cointoss? coluna: alias [coluna]; }}以上就是本文的全部内容 , 希望对大家的学习有所帮助。