Pergunta

Depois de ler esta resposta: melhor maneira de escolher um subconjunto aleatório de uma coleção ?

Isso me fez pensar, como é que se escolher uma semente aleatória em Java?

E não diga uso System.currentTimeMillis () ou System.nanoTime (). Leia o artigo para ver porque não.

Essa é uma pergunta difícil, mas deixe-me tornar mais difícil. Vamos dizer que você precisa para gerar uma semente aleatória, sem conexão com a internet, sem usar a entrada do usuário (IE, não há nenhuma gui), e tem que ser multi plataforma (portanto, nenhum JNI para hardware de acesso).

Há algumas variáveis ??JVM podemos monitorar como fonte de nossa aleatoriedade?

Isso pode ser feito? Ou é impossível?

Foi útil?

Solução

Dê uma olhada Uncommons Maths (divulgação completa: eu escrevi). Ele deve resolver a maioria dos problemas que você jamais vai ter com números aleatórios em Java.

Mesmo, se você não usá-lo você deve ser capaz de obter algumas idéias provenientes dos diversos implementações SeedGenerator que ele proporciona. Basicamente, o padrão é usar / dev / aleatória. Se isso não existe (por exemplo Windows) ele ou tenta transferir dados de random.org ou ele usa SecureRandom.generateSeed .

Eu acho SecureRandom.generateSeed é o melhor que você pode fazer sem depender de plataforma específica qualquer coisa ou na Internet.

Outras dicas

Combine System.currentTimeMillis() com um contador global que você incrementa cada vez que você gerar a semente. Use AtomicLong para o contador para que você pode incrementar com eficiência e fio de segurança.

"Combinar" não significa "add" ou "xor" porque é muito fácil de obter duplicatas. Em vez disso, hash. Você poderia ficar complicado e encher o longo e o contador no exemplo 16 bytes e MD5-lo, mas eu provavelmente iria usar uma versão do Adler CRC ou algum outro 64-bit CRC .

Um, que o artigo diz que as sementes de 32 bits são ruins, mas as sementes de 64 bits são boas. System.currentTimeMillis () é uma semente de 64 bits.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top