2013-10-30 77 views
1

所以基本上,我有這個功能,應該生成兩個隨機整數之間的高和低數字,以在窗體上的一個點。我知道Random可以處理這個問題,但Random具有一致性,而我需要這些數字在表單上完全是隨機的。真正的隨機數生成

例如,我生成的大多數點出現在對角線上。這是我想要避免的。它應該遍佈高低數字之間的形式。

這裏是我當前的功能:

Function GetNewLocation() As Point 
    Randomize() 
    Dim int1 As Integer = RandomNumber(6, 345) 
    Randomize() 
    Dim int2 As Integer = RandomNumber(35, 286) 
    Return New Point(int1, int2) 
End Function 

Function RandomNumber(ByVal low As Integer, ByVal high As Integer) As Integer 
    Randomize() 
    Return New Random().Next(low, high) 
End Function 

我怎樣才能得到真正的隨機數生成點在哪裏是不是在對角線上?

+0

計算機無法生成真正的隨機數。 – nhgrif

回答

5

每次創建Random的新實例時,您正在重置隨機數生成器。由於默認構造函數使用Environment.TickCount作爲種子,因此您經常會返回精確相同的僞隨機數序列。系統不會經常更新TickCount。這就是爲什麼你覺得你得到了非隨機數。

試着改變你這樣的代碼:

Private _rnd As New Random() 
Function RandomNumber(ByVal low As Integer, ByVal high As Integer) As Integer 
    Return _rnd.Next(low, high) 
End Function 
+0

這解決了我的問題,但「隨機化」已在Form_Load上調用。我現在意識到這個問題是我在每個循環中調用一個新的Random()。 – user2255552

+0

@ user2255552 - 我沒有碰到對'Randomize()'的調用。它似乎並不涉及隨機數的實際生成。 – Enigmativity

+1

使用隨機隨機無道理。 Randomize用於舊隨機數發生器。 – dbasnett

0

計算機系統中沒有真正的隨機性。有很多算法可以生成「隨機」數字,但它們總是基於種子,比如時間,進程ID,二者的混合,或者更嚴格的情況,即認真對待隨機性,麥克風檢測到的聲音,來自大氣傳感器或宇宙微波背景的數據,但它總是會來自一些現有的信息來源。

+0

有什麼辦法可以讓我至少避免一條對角線? – user2255552

+0

我不確定你的意思,但你可以放棄這個內置的RandomNumber(),並嘗試一些其他算法,如SFMT http://en.wikipedia.org/wiki/Mersenne_twister – Havenard

+0

http://home.comcast .net /〜charltoncr/mt19937ar.htm – Havenard

0

那也並不是最好的slution。 我更喜歡我自己的代碼:

Dim old As Integer = 6572 
Public Function Rand(ByVal min As Integer, ByVal max As Integer) As Integer 
    Dim random As New Random(old + Date.Now.Millisecond) 
    old = random.Next(min, max + CInt(IIf(Date.Now.Millisecond Mod 2 = 0, 1, 0))) 
    Return old 
End Function 

那好一點點

0

我真的只是想出了這個解決方案。也許這將幫助=)

我從去:

Dim rand As Random = New Random(DateTime.Now.Millisecond) 

Dim rand As Random = New Random(DateTime.Now.Millisecond * DateTime.Now.Second * DateTime.Now.Minute * DateTime.Now.Hour) 

它似乎工作非常出色。 你可以看到並排的差異。

Random Compare