2012-04-28 52 views
-3

我想寫一個隨機函數,返回一個隨機數,它不同於它返回的最後5個不同的數字。如何創建一個每次都返回不同值的隨機函數?

我在Excel VBA中使用

非常simular代碼:

Function Rand(ByVal Low As Long, ByVal High As Long) As Long 
Randomize 
    Num3 = Num2 
    Num2 = Num1 
    Rand = Int((High - Low + 1) * Rnd) + Low 
    Num1 = Rand 

Do While Num1 = Num2 Or Num1 = Num3 Or Sheets(Csheet).Cells(Num1, 3) > 20 

     Rand = Int((High - Low + 1) * Rnd) + Low 
    Num1 = Rand 
    Loop 
End Function 

數量也需要檢查,在希伯來書[I] .Known字是假的。 我想這一個:

private int Rand(int Min, int Max) 
     { 
      int i; 
      int x = 0; 
      Random rnd = new Random(); 
      oldNum[3] = oldNum[2]; 
      oldNum[2] = oldNum[1]; 
      oldNum[1] = oldNum[0]; 
      do 
      { 

       i = rnd.Next(Min, Max); 
       x++; 
      } 
      while (Heb[i].Known==false && x<10000 && oldNum.Contains(i)); 
      oldNum[0] = i; 
      return i; 

     } 

儘管如此,它似乎doesen't合作過好...返回每次0。

Min和Max是在它從randomises列表的區域(應爲1之間-30) 希伯來是列表中的項目的數目(約500 - 1000項) 我初始化oldNum用:

int[] oldNum = new int[3]; 
+3

Random()類有什麼問題? – 2012-04-28 15:49:37

+3

它做了什麼,你沒有想到? – BrokenGlass 2012-04-28 15:50:43

+0

Ehm,如果每個數字都必須與前五個數字不同,那麼它就不應該是隨機的!無論如何,每當你需要一個新的隨機數時,你的例子就會給隨機數生成種子,而這種方法效果不好。使'rnd'靜態並只調用一次'Random'函數。 – 2012-04-28 15:52:29

回答

1

這聽起來像你需要一個Queue

Random rng = new Random(); 
Queue<int> queue = new Queue<int>(); 

private int Rand(int min, int max) 
{ 
    int r; 

    while(queue.Contains(r = rng.Next(min, max))); 

    queue.Enqueue(r); 

    if(queue.Count > 5) queue.Dequeue(); 

    return r; 
} 
+0

或者帶有翻轉索引的簡單固定陣列。 – 2012-04-28 16:26:53

+0

太好了。非常感謝。 – 2012-04-28 17:04:53

相關問題