2009-11-23 233 views
0

我需要一個隨機數生成算法,爲特定輸入生成一個隨機數。但是每次獲得相同的輸入時它會生成相同的數字。如果這種算法可以在互聯網上或我必須建立一個。如果存在,任何人都知道,請讓我知道。 (C,C++,JAVA,C#或任何僞代碼將有很大幫助)隨機數的生成

在此先感謝。

+2

http://en.wikipedia.org/wiki/Pseudorandom_number_generator – pingw33n 2009-11-23 14:38:40

+0

你想要一個隨機數序列或單個哈希碼作爲輸入嗎? – starblue 2009-11-23 14:50:10

回答

3

通常標準實施的隨機數生成器取決於種子值。 您可以使用標準隨機,將種子值設置爲您輸入的一些哈希函數。

C#例如:

string input = "Foo"; 
Random rnd = new Random(input.GetHashCode()); 
int random = rnd.Next(); 
+0

謝謝。我投票給你。並選擇你的解決方案,這很容易:) – FlintOff 2009-11-23 14:56:01

+0

事實上,如果uoy需要爲每個輸出生成一個隨機數(不是序列),則可以使用GetHashCode()函數而不是隨機數。 – Alex 2009-11-23 15:09:10

+0

GetHashCode的整數實現返回相同的int,所以不是真正的隨機。 – Wilhelm 2009-11-23 15:59:28

4

你可能想看看內置的Java類Random.描述符合你想要的。

+0

謝謝。我投票給你。 – FlintOff 2009-11-23 14:55:10

+0

如果您想要以性能爲代價獲得更好的隨機數,則應該使用SecureRandom。 – 2009-11-23 15:16:50

1

this有些代碼應該爲你工作:

MIN_VALUE + ((MAX_VALUE - MIN_VALUE +1) * RANDOM_INPUT/(MAX_VALUE + 1)) 
  • MIN_VALUE - 下界
  • MAX_VALUE - 上界
  • RANDOM_INPUT - 輸入號
+0

謝謝。我投票給你。 – FlintOff 2009-11-23 14:56:33

2

我想使用的散列函數SHA等或MD5,這將產生用於每一次給定的輸入相同的輸出。

在java中生成散列的例子是here

+0

謝謝。我投票給你。 – FlintOff 2009-11-23 14:57:08

2

Mersenne Twister算法是一個很好的可預測隨機數發生器。大多數語言都有實現。

+1

Mersenne Twister對於這個要求太複雜了。 MT具有高度的複發性,這意味着它回顧輸出歷史中的多個樣本。例如Mersenne Twister 19937(這是通常的MT)具有624次重複,這意味着狀態緩衝器(保存的先前樣本的數量)是624個條目。 在這種情況下,他只想從單個種子生成單個樣本,因此更簡單的情況是1重複更合適。 – Tom 2009-11-23 14:53:03

+0

謝謝。我投票給你。 – FlintOff 2009-11-23 14:57:44

2

如何..

public int getRandonNumber() 
{ 
    // decided by a roll of a dice. Can't get fairer than that! 
    return 4; 
} 

還是你想一個隨機數,每次?

:-)

+0

太棒了! – Tom 2009-11-23 14:50:34

+0

謝謝。我投票給你。 – FlintOff 2009-11-23 14:58:20

+1

嘿,不要忘了這個來源,請:http://xkcd.com/221/ – Bobby 2009-11-23 15:10:24

1

所有的僞隨機數發生器(這是計算機上的大多數是隨機數發生器)將生成的數字從開始的投入,種子相同的序列。因此,您可以使用您選擇的編程語言提供的任何RNG。

鑑於你想從一個給定的種子中抽取一個樣本,我會避開Mersenne Twister和其他具有良好統計特性的複雜RNG,因爲你不需要它。你可以使用一個簡單的LCG,或者你可以使用像MD5這樣的散列函數。 LCG的一個問題是,對於一個小種子來說,下一個值通常在同一個區域,因爲模數不適用,所以如果你的輸入值通常很小,我會使用MD5。

+0

謝謝。我投票給你。 – FlintOff 2009-11-23 14:59:09