2013-05-25 24 views
6

JavaScript'te başka bir numaradan rastgele bir sayı üretmek mümkün müdür?Başka bir numaradan rastgele bir sayı üret

Fraktal arazi jeneratörlerinden biri için öngörülebilir bir rasgele sayı üreteci uygulamaya çalışıyorum. Math.random() kullanarak rasgele bir sayı üretmenin mümkün olduğunu zaten biliyorum, ancak her giriş için tam olarak bir çıktı üreten bir rasgele sayı üreteci oluşturmak istiyorum. (Örneğin, predictableRandomGenerator(1) her zaman aynı sonucu üretirdi, bu da mutlaka girişle aynı olmazdı.)

Başka bir numaradan rastgele bir sayı üretmek mümkün, bu nedenle çıktı her zaman için aynıdır. giriş?

+5

+1 açık uçlu soru için :) – Bill

+0

(https://www.google.com [Bu soru için bir Google araması yaptım] /#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 ve BAK = on.2, or.r_cp.r_qf. & BVM = bv.47008514, d.dmg & fp = 5f2a042325b2882d & biw = 1366 & bih = 639) ve herhangi bir alakalı sonuç bulamadım, bu yüzden burada yayınlamaya karar verdim. –

+0

İlgili: [Tamsayı karma işlevi hangi tamsayı karma anahtarını kabul eden iyi?] (Http://stackoverflow.com/questions/664014/what-integer-hash-function-are-good-tec-accepts-an-integer -hash-anahtar) – Blender

cevap

6

Her giriş için tek bir sözde rasgele çıktı oluşturmak için MD5 veya SHA-1 gibi bir sağlama toplamı jeneratörü kullanabilirsiniz. SHA-1, giriş olarak girilen her dizeden rasgele bir sayı üretecek ve her çıktı tam olarak bir giriş üretecektir. (Muadil jeneratörler, girilen her bir girdi için tam olarak bir çıktı ürettiğinden, diğer herhangi bir sağlama toplamı üretecinin bu amaçla da uygun olması muhtemeldir).

+0

Buradaki büyük uyarı şu gibi sağlama algoritmalarıdır. MD5 ve SHA-1 esasen * yavaş * olacak şekilde tasarlanmıştır. Gerçekten istediğiniz şey, tohumlu bir sözde sayı üretme algoritmasıdır. Buradaki anahtar kelime, başvuru yaptığınız "başlangıç ​​numarası" nın teknik terimidir. – pauljz

+2

Lütfen kişisel blogunuz olarak StackOverflow'u kullanmayın. Bu site, icatlarınızı dünya ile paylaşmak için değil, gerçek programlama soruları sormak içindir. – georg

+0

@ thg435 Kendi kendine yanıtlama soruları [aslında Yığın Taşması konusunda teşvik edilmektedir] (http://meta.stackexchange.com/a/12519/177227). –

2

İhtiyacınız olan şey tek yönlü karma işlevi denir inanıyorum. hex_md5() veya hex_sha1() öğesini deneyin.

4

Evet, bu mümkün. Ancak kendi sözde rasgele sayı üretecinizi yazmanız gerekir. Görünüşe göre, bilgisayarlar gerçekten rastgele sayılar üretemez. Bkz. Ancak rasgele gibi görünen bir sayı dizisi oluşturan bir algoritma kullanabilirsiniz.

Bu algoritma

genellikle tohum verilmiş ve her bir tohum algoritması tarafından üretilen rasgele bir sayı farklı sekansına yol açar. En yaygın algoritma, D. H. Lehmer tarafından tanımlandığı ve Donald E. Knuth tarafından Bilgisayar Programlama Sanatı, Cilt 2: Seminerik Algoritmalar, bölüm 3.2.1'de tarif edildiği gibi lineer uyumlu pseudorandom sayı üretecidir. Predict the Seed of Javascript's Math.random

+0

Sıfırdan başlamak yerine SHA-1, SHA-2 veya SHA-3 gibi mevcut bir karma işlevini kullanmak daha kolay olabilir. –

3

Sure, kimlik işlevi hakkında nasıl: Daha fazla ayrıntı için

aşağıdaki konuya bakın

function getMappedRandom(random){ return random; } 

Sana bu dönüşümü neden istediğini emin değilim, ama rastgelelik açısından o mutlaka daha iyi yapmaz. Eğer bir arazi jeneratör için bir PRNG gerekiyorsa

Random Number Generator

+0

Bu, girişi yalnızca çıktı olarak döndürecektir. Hala sahte rastlantısal mı sayılır? –

+1

@AndersonGreen: btw, eğer dürüstseniz, bunu kabul etmelisiniz. Bu, sorunuza göre sorunuzun en doğru ve doğru cevabıdır. – georg

+0

@ thg435 Teknik olarak, bu bir tür rasgele sayı üreteci olarak düşünülebilir, ancak girişini çıktı olarak döndüren bir sözde rasgele sayı üreteci, diğer rasgele sayı üreticilerinden daha az "rastgele" olabilir. testleri] (http://en.wikipedia.org/wiki/Tests_of_randomness). Belki de sorularımın orijinal ifadesi yanıltıcıydı, çünkü girdi olarak girdi üretmek için rasgele sayı üretecinin istediğimi ima ediyor gibiydi. –