Scegli un generatore casuale che sia il più veloce e buono che tu abbia bisogno di essere, e che non sia rallentato a una minima frazione della sua velocità normale dai meccanismi di sicurezza del filo. Quindi scegli un metodo per generare la distribuzione di interi [1..6] che sia veloce e precisa quanto necessario.
La semplice generatore veloce che è di qualità sufficientemente elevata da battere test standard per PRNGs come TestU01 (invece di omettere sistematicamente, come il Mersenne Twister) è Sebastiano Vigna'sxorshift64*. Sto mostrando come codice C, ma Sebastiano lo ha in Java as well:
uint64_t xorshift64s (int64_t &x)
{
x ^= x >> 12;
x ^= x << 25;
x ^= x >> 27;
return x * 2685821657736338717ull;
}
Sebastiano Vigna's site ha un sacco di informazioni utili, link e risultati di benchmark. Comprese le carte, per l'inclinazione matematica.
A quella alta risoluzione si può semplicemente usare 1 + xorshift64s(state) % 6
e il bias sarà incommensurabilmente piccolo. Se non è abbastanza veloce, implementa la divisione modulo per moltiplicazione con l'inverso. Se questo non è abbastanza veloce - se non puoi permetterti due MUL per ogni variazione - allora diventa complicato e devi tornare qui. xorshift1024* (Java) e alcuni trucchetti per la variabile potrebbero essere un'opzione.
Batching: la generazione di un array pieno di numeri e l'elaborazione, quindi il riempimento della matrice e così via, possono sbloccare alcune riserve di velocità. Avvolgere le cose in modo inutile nelle classi realizza il contrario.
P.S .: se ThreadLocalRandom e xorshift * non sono abbastanza veloci per i tuoi scopi, anche con il batching, potresti fare delle cose nel modo sbagliato, oppure potresti farlo nella lingua sbagliata. O entrambi.
P.P.S .: in lingue come Java (o C# o Delphi), l'astrazione non è gratuita, ha un costo. In Java devi anche fare i conti con cose come il controllo obbligatorio dei limiti dell'array gratuito, a meno che tu non abbia un compilatore in grado di eliminare quei controlli. Prendere in giro le prestazioni elevate da un programma Java può essere molto complicato ... In C++ ottieni gratuitamente astrazione e prestazioni.
Il risultato ti dà un suggerimento: la parallelizzazione dovrebbe estendersi all'intero algoritmo, non solo ai tiri di dado. – duffymo
Non sono sicuro di poter eseguire l'algoritmo in blocchi, perché il numero di volte che viene eseguito dipende dai valori ottenuti, potrebbe terminare dopo aver chiamato la funzione casuale 6 volte – spyr03
Cosa * è * l'algoritmo? Come indicato da duffymo, se dividi il lavoro al livello più alto, puoi avere più numeri di crunch di thread in parallelo. Senza vedere l'algoritmo/problema attuale possiamo solo offrire consigli generali e ipotesi selvagge. – DarthGizka