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
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.
I vertex shader a volte dispongono di generatori di rumore incorporati che è possibile utilizzare, come la funzione noise()
di cg.
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
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
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.
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
- 1. Generazione di numeri casuali senza ripetizioni
- 2. generazione di numeri casuali senza ripetizione consecutiva
- 3. Generazione contemporanea di numeri casuali
- 4. Spark - Generazione di numeri casuali
- 5. Generazione di numeri casuali di grandi dimensioni
- 6. Generazione di numeri casuali diversi tra OS
- 7. Operazioni bit a bit su numeri non
- 8. Generazione di numeri casuali in applicazioni MVC
- 9. Generazione di numeri casuali molto grandi java
- 10. Generazione di numeri casuali su Spartan-3E
- 11. Generazione casuale di numeri casuali in R
- 12. Generazione di numeri casuali uniformemente distribuiti
- 13. Deterministica generazione di numeri casuali su sistemi
- 14. Generazione sequenziale di numeri casuali distribuiti in Ruby 1.9.2
- 15. Generazione di numeri casuali nell'intervallo con una distribuzione di probabilità
- 16. C++ 11 numeri casuali
- 17. I semi vicini nella generazione di numeri casuali possono fornire numeri casuali simili?
- 18. Genera numeri casuali senza utilizzare alcuna funzione esterna
- 19. Python's pythonto library per generazione di numeri casuali vs os.urandom
- 20. Operazioni bit a bit a 48 bit in Javascript?
- 21. Generazione di due sequenze indipendenti di numeri casuali (C++)
- 22. Generazione di numeri casuali da -n a n in C
- 23. srand (time (0)) e generazione di numeri casuali
- 24. Generazione di numeri casuali nell'obiettivo C per iPhone SDK
- 25. Generazione parallela di numeri casuali con Akka Futures
- 26. Differenza tra generazione di numeri casuali C++ e Python
- 27. Generazione di numeri casuali con awk nella shell BASH
- 28. Generazione di numeri casuali con probabilità ponderate in python
- 29. Generazione di numeri interi casuali con probabilità date
- 30. generazione di enumerazioni casuali
che sembra essere abbastanza casuale, grazie! – Martin
Sicuro. Non hai bisogno di una grande qualità statistica per la grafica. –