2015-10-31 3 views
1

Я пытаюсь создать случайное число между X и Y без повторения. Все выходы 0s.Случайное число без повторения

Какая ошибка в следующем коде? Используя Loop While, он работает, но я хочу знать, в чем проблема с кодом Loop Until.

Sub Main() 
    Dim X, Y, temp, difference, rNumbers(19) As Integer 
    Dim Exist As Boolean = False 
    Dim rndm As New System.Random 
    Console.WriteLine("Enter the value of X") : X = Console.ReadLine() 
    Console.WriteLine("Enter the value of Y") : Y = Console.ReadLine() 
    If Y < X Then 
     temp = X 
     X = Y 
     Y = temp 
    End If 
    difference = Y - X 
    If difference < 20 Then 
     Console.WriteLine("Error, try again! The difference between X and Y must be greater than 20") 
     Main() 
    Else 
     For Count = 0 To 19 
      Do 
       temp = rndm.Next(X, Y) 
       Exist = False 
       For Count_2 As Integer = 0 To Count 
        If temp = rNumbers(Count_2) Then 
         Exist = True 
        End If 
       Next 
      Loop Until Exist = False 
      Console.WriteLine(rNumbers(Count)) 
     Next 
    End If 
End Sub 
+4

Включить функцию Strict. Ваш RNG должен быть «rndm.Next (X, Y + 1)». Я не могу видеть, где вы когда-либо храните значение 'rNumbers'. Создание массива значений от X до Y и перетасовка их было бы проще. – Plutonix

+0

Я согласен с @Plutonix, лучший вариант - создать список. Что-то вроде 'Dim numbers = Enumerable.Range (X, ((Y - X) + 1)) OrderBy (Function (i) Guid.NewGuid.ToString()) ToList()' Вы можете испускать 'ToList', если вы предпочитают работать с перечислителем. –

+1

Спасибо за ваши предложения, но это вопрос экзамена, который не позволяет использовать счетчики. –

ответ

0

Хотя я C# разработчик и я должен преобразовать код в C#, чтобы понять полную логику, но я уверен, что нет никаких причин, этот код будет работать, как и ожидалось, позвольте мне перечислить несколько вопросов:

  1. Где значения, заполненные в int[] rNumbers, я не вижу, чтобы он получал заселенную почтовую инициализацию, поэтому он всегда будет содержать ноль, и вы печатаете значения из того же массива, которые всегда равны 0, поэтому не может ожидать каких-либо других

  2. Ценности X, Y введены пользователем, и они нуждаются в промежутке в 20, теперь в цикле do-while, значение temp, которое является случайным числом, образованным между X, Y, сравнивается для значений в int[] rNumbers, а затем оно будет продолжаться в while loop в дальнейшем, но так как сравнение только со значением 0 в rNumbers массиве, поэтому он не будет в основном не придется цикл do-while выполняется за первый do

  3. Теперь Random Number, System.Random является псевдослучайной номер класса, который никогда не будет генерировать истинное случайное число, проверьте следующее Jon Skeet:

True Random Number Generator

Он использует System.Cryptography для генерации этого Случайныx Чисел

Поэтому вам нужно сделать эти важные изменения, ожидать соответствующий результат

0

Алгоритм работает сейчас.

Sub Main() 
    Dim X, Y, temp, difference, rNumbers(19), tempo As Integer 
    Dim Exist As Boolean 
    Dim rndm As New System.Random 
    Console.WriteLine("Enter the value of X") : X = Console.ReadLine() 
    Console.WriteLine("Enter the value of Y") : Y = Console.ReadLine() 
    If Y < X Then 
     temp = X 
     X = Y 
     Y = temp 
    End If 
    difference = Y - X 
    If difference < 20 Then 
     Console.WriteLine("Error, try again! The difference between X and Y must be greater than 20") 
     Main() 
    Else 
     For Count = 0 To 19 
      Do 
       Exist = False 
       tempo = rndm.Next(X, Y) 
       For Count_2 As Integer = 0 To Count 
        If rNumbers(Count_2) = tempo Then 
         Exist = True 
        End If 
       Next 
      Loop Until Exist = False 
      rNumbers(Count) = tempo 
      Console.WriteLine(rNumbers(Count)) 
     Next 
    End If 
End Sub 
Смежные вопросы