Domanda

Sto usando un'implementazione C # di Mersenne Twister ho scaricato da CenterSpace . Ho due problemi con esso:

  1. Non importa quanto mi seme l'algoritmo non passa test DieHard , e con questo voglio dire ho un bel po 'di 1 e 0 per i p-value. Anche il mio KStest su 269 p-value è 0. Beh, io non riesco a interpretare p-value, ma credo che un paio di 1 e 0 nel risultato è una cattiva notizia.
  2. Mi è stato chiesto di mostrare visivamente la casualità dei numeri. Così ho tracciare i numeri che vengono generati, e questo non mi sembra casuale a tutti. Ecco due screenshot del risultato dopo pochi secondi e qualche secondo dopo . Come si può vedere nella seconda schermata i numeri cadono su alcune linee parallele. Ho provato diversi algoritmi per mappare i numeri di punti. Tutti si traducono in linee parallele, ma con diverse angolazioni! Questo è come mi mappato i numeri a punti per questi screenshot: new Point(number % _canvasWidth, number % _canvasHeight). Come si può immaginare, il risultato visivo dipende dalla larghezza della forma e altezza, e questo è un risultato disastroso.

Ecco alcuni modi ho cercato di seminare l'algoritmo:

  1. ingresso utente. Entro alcuni numeri per seminare l'algoritmo come un array int.
  2. I numeri casuali generati dal algoritmo stesso !!
  3. Una serie di new Guid().GetHashCode()

Che cosa mi manca qui? Come devo seminare l'algoritmo? Come posso ottenere passare il DieHard?

È stato utile?

Soluzione

Mentre non posso parlare con il vostro primo punto, il secondo problema ha a che fare con il modo si sta Computing i punti a cui attingere. In particolare,

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

vi darà un "modello" che corrisponde in qualche modo al rapporto di aspetto della finestra che si sta disegnando a. Per esempio, se _canvasWidth e _canvasHeight erano uguali, si dovrebbe sempre disegnare su una sola riga diagonale come x e y sarebbe sempre lo stesso. Questa rappresentazione grafica non sarebbe appropriato in questo caso, quindi.

Quali di prendere le N bit dell'uscita RNG e utilizzando metà per la coordinata x e l'altra metà per la coordinata y? Per quei pezzi che cadono fuori dai limiti della finestra che si potrebbe prendere in considerazione due opzioni:

  1. Non li disegnare (o disegnare fuori campo)
  2. Eseguire un'interpolazione lineare per mappare la gamma di bit alla larghezza / altezza della finestra

Entrambe le opzioni dovrebbe darvi un quadro più rappresentativo dei bit che state ottenendo il nostro del generatore di numeri casuali. Buona fortuna!

Altri suggerimenti

Il problema stripy punto-plotting dovrebbe facilmente essere fissato generando un nuovo numero casuale per ciascuna delle coordinate xey. Cercando di riutilizzare un singolo numero generato per xey è fondamentalmente l'ottimizzazione prematura, ma se non imboccare questa strada, assicuratevi di estrarre i bit differenti per ogni dal numero; come è, x=n%width;y=n%height ti dà un enorme correlazione tra X e Y, come si può vedere nelle immagini.

ho usato varie implementazioni C ++ Mersenne Twister per anni (più recentemente S ') spinta per generare casuale punti e non ha avuto problemi con esso (seme legati o altro). E 'davvero un generatore superba.

True casuale la generazione di numeri non può essere fatto con una funzione matematica. Se è importante avere numeri veramente casuali, ottenere un generatore di numeri casuali . Ho sviluppato online con soldi veri giochi di poker-tale hardware è l'unico modo per essere sicuri non ci sono modelli nei numeri.

Se mira un ambiente Linux, il / dev / random e / dev / urandom dispositivi pseudo fare molto meglio di un generatore di matematica, in quanto incorporano numeri casuali che rappresentano l'attività hardware.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top