2009-06-17 18 views
6

Sto scrivendo un vertex shader al momento e ho bisogno di alcuni numeri casuali. L'hardware Vertex shader non ha operazioni logiche/bit, quindi non posso implementare nessuno dei generatori di numeri casuali standard. È possibile creare un generatore di numeri casuali usando solo l'aritmetica standard? la casualità non deve essere particolarmente buona!Generazione di numeri casuali senza utilizzare operazioni bit

risposta

5

Se non ti dispiace scadente casualità, un metodo classico è

x[n+1] = (x[n] * x[n] + C) mod N 

dove C e N sono costanti, C! = 0 e C! = -2, e N è primo. Questo è un tipico generatore pseudocasuale per il factoring di Pollard Rho. Prova C = 1 e N = 8051, quelli funzionano bene.

+0

che sembra essere abbastanza casuale, grazie! – Martin

+0

Sicuro. Non hai bisogno di una grande qualità statistica per la grafica. –

2

I vertex shader a volte dispongono di generatori di rumore incorporati che è possibile utilizzare, come la funzione noise() di cg.

+0

HLSL ha una funzione di rumore che si può usare: http://msdn.microsoft.com/en-us/library/bb509629(VS.85).aspx Tuttavia ogni volta che ho usato in passato è non ha mai funzionato, anzi fino a poco tempo fa credevo che fosse contrassegnato come "non ancora implementato"! – Martin

2

Uso un linear congruential generator:

X_(n+1) = (a * X_n + c) mod m 

Quelli non sono che forte, ma almeno sono ben noti e possono avere lunghi periodi. La pagina di Wikipedia ha anche buone raccomandazioni:

Il periodo di un LCG generale è al massimo m, e per alcune scelte di una molto meno di quello. La LCG avrà una completa periodo, se e solo se:

1. c and m are relatively prime, 
2. a - 1 is divisible by all prime factors of m, 
3. a - 1 is a multiple of 4 if m is a multiple of 4 
2

crediate o no, ho utilizzato newx = oldx * 5 + 1 (o una leggera variazione di esso) in diversi videogiochi. La casualità è orribile - è più una sequenza criptata che un generatore casuale. Ma a volte è tutto ciò di cui hai bisogno. Se ricordo correttamente, passa attraverso tutti i numeri prima che si ripeta.

Ha alcune caratteristiche terribili. Non ti dà mai lo stesso numero due volte di seguito. Alcuni di noi hanno fatto un sacco di test sulle varianti e abbiamo usato alcune variazioni in altri giochi.

Lo abbiamo usato quando non c'era un buon modulo a nostra disposizione. È solo uno spostamento di due e due aggiunte (o una moltiplicazione per 5 e una aggiunta). Non lo userei mai al giorno d'oggi per numeri casuali - userò un LCG - ma forse funzionerebbe bene per uno shader dove la velocità è cruciale e il set di istruzioni potrebbe essere limitato.

+0

hehe, questo è un RNG interessante, il più matematicamente facile da capire che ho visto di sicuro! Avrò un gioco con questo, dal momento che come dici tu la velocità è fondamentale. – Martin

Problemi correlati