Pergunta

Estou usando uma implementação C# de Mersenne Twister que eu baixei Centerspace. Eu tenho dois problemas com isso:

  1. Não importa como eu semear o algoritmo, ele não passa Testes obstinados, e com isso quero dizer, recebo bastante 1s e 0s para o valor p. Além disso, meu Kstest em 269 valores de p é 0. Bem, não consigo interpretar o valor P, mas acho que alguns 1s e 0s no resultado são más notícias.
  2. Foi -me pedido para mostrar visualmente a aleatoriedade dos números. Então, eu plotei os números como eles são gerados, e isso não parece aleatório. Aqui estão duas capturas de tela do resultado Depois de alguns segundos e Alguns segundos depois. Como você pode ver na segunda captura de tela, os números caem em algumas linhas paralelas. Eu tentei algoritmos diferentes para mapear números para pontos. Todos eles resultam em linhas paralelas, mas com ângulos diferentes! Foi assim que mapeei números para pontos para essas capturas de tela: new Point(number % _canvasWidth, number % _canvasHeight). Como você pode imaginar, o resultado visual depende da largura e da altura do formulário, e isto é um resultado desastre.

Aqui estão algumas maneiras pelas quais tentei semear o algoritmo:

  1. Entrada do usuário. Entro em alguns números para semear o algoritmo como uma matriz int.
  2. Números aleatórios gerados pelo próprio algoritmo !!
  3. Uma variedade de new Guid().GetHashCode()

O que estou perdendo aqui? Como devo semear o algoritmo? Como posso conseguir passar pelo obstinado?

Foi útil?

Solução

Embora eu não possa falar com o seu primeiro ponto, o segundo problema tem a ver com a forma como você está calculando os pontos a serem utilizados. Especificamente,

x = number % _canvasWidth;
y = number % _canvasHeight;

dará a você um "padrão" que corresponde um pouco à proporção da janela para a qual você está desenhando. Por exemplo, se _canvasWidth e _canvasHeight eram iguais, você sempre desenhava em uma única linha diagonal como x e y sempre seria o mesmo. Esta representação gráfica não seria apropriada neste caso, então.

Que tal pegar os n bits da saída RNG e usar metade para a coordenada X e a outra metade para a coordenada Y? Para os bits que caem dos limites da sua janela, você pode considerar duas opções:

  1. Não desenhe -os (ou desenhe -os para fora da tela)
  2. Realize uma interpolação linear para mapear o intervalo de bits para a largura/altura da sua janela

Qualquer uma das opções deve fornecer uma imagem mais representativa dos bits que você está recebendo do seu gerador de números aleatórios. Boa sorte!

Outras dicas

Seu problema listrado de plotagem pontual deve ser facilmente corrigido, gerando um novo número aleatório para cada uma das coordenadas X e Y. Tentar reutilizar um único número gerado para x e y é basicamente otimização prematura, mas se você seguir essa rota, extraia bits diferentes para cada um do número; como é, x=n%width;y=n%height fornece uma enorme correlação entre x e y, como pode ser visto em suas imagens.

Eu uso várias implementações C ++ Mersenne Twister há anos (mais recentemente impulsoS) para gerar aleatória pontos e não teve dificuldades com isso (sementes ou não). É realmente um gerador excelente.

Verdadeiro aleatório A geração de números não pode ser feita com uma função matemática. Se for importante ter números verdadeiramente aleatórios, obtenha um Gerador de números aleatórios de hardware. Desenvolvi jogos de poker on -line em dinheiro real - como hardware é a única maneira de ter certeza de que não há padrões nos números.

Se mirar em um ambiente Linux, o /Dev/Random e/Dev/Urandom Pseudo -Dispositivos Faça muito melhor do que um gerador matemático, pois eles incorporam números aleatórios representando a atividade de hardware.

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