Devo usar um mecanismo aleatório semeado de std :: random_device ou usar std :: random_device toda vez
Eu tenho uma classe que contém duas fontes de aleatoriedade.
std::random_device rd;
std::mt19937 random_engine;
Eu semo ostd::mt19937
com uma chamada parastd::random_device
. Se eu quiser gerar um número e não me importo com a repetibilidade, devo ligarrd()
ourandom_engine()
?
No meu caso particular, tenho certeza de que ambos funcionariam muito bem, porque isso será chamado em algum código de rede, em que o desempenho não é muito alto, e os resultados não são especialmente sensíveis. No entanto, estou interessado em algumas "regras gerais" sobre quando usar a entropia de hardware e quando usar números pseudo-aleatórios.
Atualmente, estou usando apenasstd::random_device
semear meustd::mt19937
motor, e qualquer geração de números aleatórios que eu preciso para o meu programa, eu uso ostd::mt19937
motor.
edit: Aqui está uma explicação para exatamente o que estou usando este exemplo específico para:
Isto é para um programa de jogo. Este jogo particular permite que o usuário personalize seu 'time' antes de começar uma rodada contra um oponente. Parte da criação de uma batalha envolve o envio de uma equipe ao servidor. Meu programa tem várias equipes e usa o número aleatório para determinar qual equipe carregar. Cada nova batalha faz uma chamada parastd::random_device
para semear o gerador de números pseudo-aleatórios. Eu registro o estado inicial da batalha, que inclui essa equipe que estou selecionando aleatoriamente e a semente inicial.
O número aleatório particular que estou perguntando nesta questão é para a seleção aleatória da equipe (onde é benéfico não ter o adversário sabendo de antemão qual time eu estou usando, mas não crítico), mas o que eu ' M realmente procurando é uma regra de ouro. Tudo bem usar semprestd::random_device
se eu não precisar de repetibilidade dos meus números, ou há um risco real de usar entropia mais rápido do que pode ser coletado?