2013-05-25 33 views
6

In JavaScript, è possibile generare un numero casuale da un altro numero?Genera un numero casuale da un altro numero

Sto cercando di implementare un generatore di numeri casuali prevedibile per uno dei miei generatori di terreno frattale. So già che è possibile generare un numero casuale usando Math.random(), ma voglio creare un generatore di numeri casuali che produca esattamente un output per ogni input. (Ad esempio, predictableRandomGenerator(1) produce sempre lo stesso risultato, che non sarebbe necessariamente uguale all'input.)

Quindi è possibile generare un numero casuale da un altro numero, in cui l'uscita è sempre la stessa per ogni ingresso?

+5

+1 per domanda aperta :) – Bill

+0

[Ho fatto una ricerca su Google per questa domanda] (https://www.google.com /#output=search&sclient=psy-ab&q=generate+a+random+number+from+another+number&oq=generate+a+random+number+from+another+number&gs_l=hp.3...1535.7376.1.7602.44.30. 0.13.13.0.320.2958.20j8j1j1.30.0 ... 0.0.0..1c.1.12.hp.SBAwn8WM_NM & psj = 1 & BAV = on.2, or.r_cp.r_qf. & BVM = bv.47008514, d.dmg & fp = 5f2a042325b2882d & biw = 1366 & bih = 639), e non ho trovato risultati rilevanti, quindi ho deciso di postarlo qui. –

+0

Corretto: [Quale funzione di hash intero è valida per accettare un hash intero?] (Http://stackoverflow.com/questions/664014/what-integer-hash-function-are-good-that-accepts-an-integer -hash-key) – Blender

risposta

6

È possibile utilizzare un generatore di checksum come MD5 o SHA-1 per generare un singolo output pseudo-casuale per ogni input. SHA-1 genererà un numero casuale da ogni stringa inserita come input e ogni uscita produrrà esattamente un input. (È probabile che qualsiasi altro generatore di checksum sia adatto anche a questo scopo, poiché i generatori di checksum producono esattamente un'uscita per ogni input immesso).

+0

Il grande avvertimento qui è che algoritmi di checksum come MD5 e SHA-1 sono essenzialmente progettati per essere * lenti *. Quello che vuoi veramente è un algoritmo di generazione di numeri pseudocasuali con seme. La parola chiave qui è seeded, che è il termine tecnico per quel "numero iniziale" a cui fai riferimento. – pauljz

+2

Si prega di non utilizzare StackOverflow come blog personale. Questo sito è per fare domande di programmazione reali, non per condividere le tue invenzioni con il mondo. – georg

+0

@ thg435 Domande con risposta automatica [è effettivamente incoraggiata su Stack Overflow] (http://meta.stackexchange.com/a/12519/177227). –

2

Credo che quello che ti serve sia chiamato funzione hash a senso unico. prova hex_md5() o hex_sha1().

4

Sì, è possibile. Comunque dovrai scrivere il tuo generatore di numeri pseudo-casuali.

Vedere, i computer non possono realmente generare numeri casuali. Tuttavia è possibile utilizzare un algoritmo che crea una sequenza di numeri che sembra essere casuale.

Questo algoritmo viene di solito fornito un seme e ogni seme porta a una diversa sequenza di numeri casuali generati dall'algoritmo.

L'algoritmo più comune è il generatore di numeri pseudocasuali congruenziali lineari, come definito da D. H. Lehmer e descritto da Donald E. Knuth in The Art of Computer Programming, Volume 2: Algoritmi seminali, sezione 3.2.1.

Per maggiori dettagli fare riferimento alla seguente discussione: Predict the Seed of Javascript's Math.random

+0

Potrebbe essere più semplice utilizzare una funzione di hash esistente, ad esempio SHA-1, SHA-2 o SHA-3, anziché iniziare da zero. –

3

Certo, come circa la funzione identità:

function getMappedRandom(random){ return random; } 

io non sono sicuro perché si vuole questa trasformazione, ma in termini di casualità è non lo rende necessariamente migliore

Random Number Generator

+0

Ciò restituirà semplicemente l'input come output. È ancora considerato pseudo-casuale? –

+1

@AndersonGreen: btw, se sei onesto, dovresti accettare questo. Questa è la risposta più precisa e corretta alla tua domanda. – georg

+0

@ thg435 Tecnicamente, questo sarebbe considerato un tipo di generatore di numeri casuali, ma un generatore di numeri pseudo-casuali che ha restituito il suo output come input potrebbe essere molto meno "casuale" di molti altri generatori di numeri casuali, come giudicato da [casualità statistica test] (http://en.wikipedia.org/wiki/Tests_of_randomness). Forse la formulazione originale della mia domanda era fuorviante, dal momento che sembrava implicare che volevo che il generatore di numeri casuali producesse il suo input come output. –

0

Se avete bisogno di un PRNG per un generatore di terreno, quindi sto assumendo avete bisogno di un generatore di numeri casuali testa di serie che riproduce la sequenza di numeri pseudo-casuali per un dato seme; In modo tale che ogni seme crei un terreno separato e distinto che può essere ricostruito in seguito fornendo lo stesso seme.

Questo potrebbe funzionare per voi:

http://davidbau.com/archives/2010/01/30/random_seeds_coded_hints_and_quintillions.html http://davidbau.com/encode/seedrandom.js

Problemi correlati