好的,所以我使用int indexSelector = RandomNumber(1, 14);
創建一個隨機數並從數組中拉出匹配的索引。但它似乎只能撥打3或4個號碼。像被拉出的物品非常相似。C#隨機數
怎麼回事?
好的,所以我使用int indexSelector = RandomNumber(1, 14);
創建一個隨機數並從數組中拉出匹配的索引。但它似乎只能撥打3或4個號碼。像被拉出的物品非常相似。C#隨機數
怎麼回事?
聽起來好像你正在調用一個函數,在每次調用時重新創建一個Random對象。 不要在每次函數調用時重新創建Random對象。
所以做這樣的事情:
private Random random = new Random();
public int RandomNumber(int min, int max)
{
return random.Next(min, max);
}
每布賴恩的建議,某處定義Random
對象,它不會重新創建:
Random r = new Random();
,並以此來獲得數:
int indexSelector = r.Next(1, 14);
使您的隨機變量爲靜態:
static Random random = new Random();
如果它是在調用RandomNumber的「每個」時間構造的,那麼使它成爲靜態不會產生任何影響。靜態只讀,你有所作爲 – 2010-09-12 20:13:50
@Rune:有一個初始化實例,我們可以假設每次都沒有被替換。 – 2010-09-12 20:54:41
請注意,Random類的方法不是線程安全的,因此將其用作靜態變量將需要鎖定。 – tia 2010-09-13 02:05:55
Random
如果由相同的種子提供,總是返回數字的相同的序列。我建議你初始化使用隨機種子:
Random r = new Random(Environment.TickCount);
甚至更好:
Random r2 = new Random(BitConverter.ToInt32(Guid.NewGuid().ToByteArray(), 0));
這可以確保您創建一個真正的隨機數序列。如果你沒有發送種子,系統將使用一個時間依賴的種子,如果你一個接一個地創建它們,它將是相同的。
不能保證Guid的前四個字節是一個好種子。你的第一個建議正是「Random」的默認構造函數目前的工作原理。因此遭受同樣的問題:種子每隔幾毫秒就會改變一次。 – CodesInChaos 2011-07-16 08:23:28
我應該從數學上證明GUID更好嗎? – Aliostad 2011-07-16 16:18:37
GUID生成器只嘗試實現唯一性。它並不能保證GUID部分的良好分佈。雖然當前在窗口上實施GUID確實基於高質量的隨機數,但沒有合約義務保持這種狀態。 http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071。aspx – CodesInChaos 2011-07-16 16:50:38
這是什麼'RandomNumber'函數? BCL中沒有這樣的功能,所以不要指望我們知道它的作用,以及爲什麼它返回相同的數字。 – 2010-09-12 19:27:02
你可以給出一個完整的代碼清單,包括你的RandomNumber方法 – 2010-09-12 19:28:40
RandomNumber不是一個方法的好名字。你至少應該命名爲「GetRandomNumber」 – 2010-09-12 19:29:37