2012-04-28 2 views
-3

Я пытаюсь написать случайную функцию, которая возвращает случайное число, которое отличается от последних пяти последних чисел, которые оно вернуло.Как создать случайную функцию, которая каждый раз возвращает другое значение?

очень Двойники код, который я использую в Excel VBA:

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 

Число также необходимо проверить, что слово в СЭП [я] .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()? –

+3

Что вы делаете, чего не ожидали? – BrokenGlass

+0

Ehm, если каждый номер должен отличаться от предыдущих пяти, это не так произвольно, как должно быть! Во всяком случае, ваш пример заражает случайным образом каждый раз, когда вам нужно новое случайное число, и это плохо работает. Сделайте статичность «rnd» и вызовите функцию «Случайный» только один раз. –

ответ

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

Или простой фиксированный массив с индексом опрокидывания. –

+0

Отлично. Большое спасибо. –

Смежные вопросы