Qual è il modo migliore per limitare i valori di un PRNG a un intervallo più piccolo? Se si utilizza modulo e il vecchio numero massimo non è equamente divisibile per il nuovo numero massimo si polarizza verso lo 0
tramite (old_max - new_max - 1)
. Suppongo che il modo migliore sarebbe qualcosa di simile (questo punto è fluttuante, non matematica intero)Qual è il metodo corretto per limitare un numero casuale di pseduo a un intervallo più piccolo?
random_num = PRNG()/max_orginal_range * max_smaller_range
ma qualcosa nel mio stomaco mi fa dubitare che il metodo (forse floating point differenze di implementazione e di rappresentanza?).
Il generatore di numeri casuali produrrà risultati coerenti su piattaforme hardware e software e anche il vincolo deve essere rispettato.
Avevo ragione a dubitare dello pseudocodice sopra (ma non per le ragioni che stavo pensando). Il numero answer di MichaelGG mi ha fatto riflettere sul problema in un modo diverso. Posso modellarlo usando numeri più piccoli e testare ogni risultato. Quindi, supponiamo di avere un PRNG che produce un numero casuale compreso tra 0 e 31 e si desidera che l'intervallo più piccolo sia compreso tra 0 e 9. Se si utilizza il modulo si polarizza verso 0, 1, 2 e 3. Se si utilizza lo pseudocodice sopra di voi la preferenza verso 0, 2, 5 e 7. Non penso che ci possa essere un buon modo per mappare un set nell'altro. Il meglio che ho trovato finora è quello di rigenerare i numeri casuali che sono maggiori di old_max/new_max
, ma che ha anche problemi profondi (riduzione del periodo, tempo per generare nuovi numeri fino a quando uno è nella giusta fascia, ecc.) .
Penso che potrei aver ingenuamente affrontato questo problema. Potrebbe essere il momento di iniziare una ricerca seria sulla letteratura (qualcuno deve averlo affrontato prima).
È anche possibile dare un'occhiata a java.util.Random.nextInt (int) che utilizza un metodo piuttosto intelligente per limitare il risultato senza introdurre bias. Mi ci è voluto un giorno per capire perché funziona, però :) – Joey
Dove è disponibile questa fonte (Scusa, non sono un codificatore Java, non so nulla di dove sia l'API) – DevinB
Il controllo casuale non è un buona idea, ma se riduco i numeri a qualcosa di gestibile posso testare ogni risultato (vedi sopra), e lo pseudocodice è in realtà di parte. Ora devo scavare attraverso articoli che difficilmente capisco, sospiro. –