2012-04-28 53 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

相关问题