2013-03-12 114 views
1

我想要做的就是讓我創建的遊戲每5秒隨機更換一次角色。 我通過一個計時器得到了這個工作,唯一的問題是我不想讓他們重複,我目前正在研究虛擬代碼,所以它只是改變屏幕顏色,但我怎樣才能使它不重複它剛纔的電話號碼?隨機數字不重複

if (timer <= 0) 
{ 
    num = rand.Next(2); 
    timer = 5.0f; 
} 

這是當前的代碼,然後在繪製我真的剛剛完成「如果num等於某個數字,然後更改背景顏色」。

我嘗試添加一個prev_num檢查,但我不能讓它正常工作(這裏是)

if (timer <= 0) 
{ 
    prev_number = num; 
    num = rand.Next(2); 
    if (prev_number == num) 
    { 
     num = rand.Next(2); 
    } 
    else 
    { 
     timer = 5.0f; 
    } 
} 
+0

一個真正的隨機數將包括重複這樣試圖排除這意味着@JoeW我認爲這是該點的數量是不是真的隨機 – 2013-03-12 12:15:55

+0

,否則rand.Next()就足夠了 – Hannesh 2013-03-12 12:58:53

+0

@Hannesh點是隨機的不是隨機的數字? – 2013-03-12 13:01:23

回答

0

也許只是把它變成一個循環,而不是一個單一的檢查?
此外,我認爲,因爲你的計時器是在else裏面,所以並不總是 更新正確。

if (timer <= 0) 
{ 
    tempNum = rand.Next(2); 

    do 
    { 
     tempNum = rand.Next(2); 
    } 
    while (tempNum == num) 

    num = tempNum; 
    timer = 5.0f; 
} 
1

考慮到,如果你挑選(例如)1-5之間的隨機數則有五種可能的結果,因此會使用rand.Next(5)選擇的零基礎的「序」或索引結果,然後將其轉換爲您實際需要的範圍(在這種情況下,通過添加一個)。

如果你想要一個0-4的隨機數,不包括你剛挑選的數字,那麼只有四個可能的結果,而不是五個 - 如果前一個數是3,那麼可能的結果是0,1,2或4.然後,您可以通過選擇其中一個結果(​​)並將該序數映射到您想要的範圍來簡化您的算法。一個簡單的映射就是說如果新的隨機數字低於先前的數字,則按原樣返回,否則(如果相等或更大)則添加一個。

int new_num = rand.Next(4); 
if(new_num >= prev_num) 
{ 
    new_num++; 
} 

您的新號碼現在保證與前一號碼的範圍相同,但不等於它。

0

創建一個連續數字數組,然後在你的應用程序開始時將它們洗牌(如一副紙牌)。

int[] numbers = new int[100]; 
for(int i = 0; i < numbers.Length; i++) 
    numbers[i] = i; 
Shuffle(numbers); 

使用洗牌函數列表:

public static void Shuffle<T>(IList<T> list) 
{ 
    Random rng = new Random(); 
    int n = list.Count; 
    while (n > 1) { 
     n--; 
     int k = rng.Next(n + 1); 
     T value = list[k]; 
     list[k] = list[n]; 
     list[n] = value; 
    } 
} 

然後,您可以依次訪問它們淘汰之列。隨着列表被洗牌,它們將是隨機的,但是您不會有任何重複,因爲每個數字只在列表中存在一次。

if (timer <= 0) 
{ 
    num = numbers[index]; 
    index++; 
    timer = 5.0f; 
}