2017-02-21 3 views
-3

Я видел много учебников, но, похоже, для меня это не работает. Мне нужно генерировать случайные числа, не повторяя.Генерировать случайные числа без повторения

Это мой код:

Dim intNumber As Integer 
    Dim arrNumber(0 To 0) As Integer 
    Dim i, x, y As Integer 
    'Make sure the Label is clear 
    Label1.Text = "" 



    For x = 0 To 0 
Start: 
     intNumber = Int((25 * Rnd()) + 1) ' Random number 1 to 25 
     For y = 0 To 0 
      ' Check arrNumber (y) 
      'If intnumber has already been selected, 
      'Then go and select another one. 
      If intNumber = arrNumber(y) Then 
       GoTo Start 
      End If 
     Next y 

     'Place the next non-repeated number in the arrNumber(x). 

     arrNumber(x) = intNumber 


    Next x 

    '---------------------------------------------------- 
    For i = 0 To 0 

     Label1.Text = Label1.Text & (arrNumber(i)) 
     broj1.random.Text = Label1.Text 
    Next 

End Sub 
+0

Не видя кода, я могу только догадываться, что вы инициализация случайного числа генератора более одного раза, что приведет к генерированию одинаковых чисел. –

+0

Извините, я отредактировал сообщение, я вставляю код, который я использовал до – AceDuk

+0

. Пожалуйста, отредактируйте свой вопрос, чтобы уточнить. Вы ищете номера от 1 до 25 в случайном порядке? Пожалуйста, поймите, что это присуще случайности, которая иногда повторяется. Посмотрите «парадокс дня рождения». –

ответ

1

Ваша проблема, особенно в VB, трудно решить. Вы ищете случайную сделку , а не случайный рулон. То есть вы ищете эмуляцию дилера казино, который берет карты из перетасованной колоды из 25 карт по одному, а не дилера, вращающегося в рулонах с 25 слотами.

Одна вещь, которая делает ее трудной, - это 26-я карта. Рокировка? Сделка в том же порядке?

Вот достойный эссе по теме. http://www.4guysfromrolla.com/articles/070208-1.aspx

Вот код C# для решения.

private static List<int> _deck = null; 
    private static readonly Random NumberGenerator = new Random(); 
    public static int Deal() 
    { 
     if (_deck == null || _deck.Count == 0) 
     { 
      /* new deck */ 
      _deck = new List<int>(); 
      for (var i = 0; i <= 24; i++) _deck.Add(i); 
     } 

     /* get a random card from the remaining deck */ 
     var next = NumberGenerator.Next(0, _deck.Count); 
     /* retrieve the card's number */ 
     var q = _deck[next]; 
     /* and remove the card from the deck */ 
     _deck.RemoveAt(next); 
     /* return in range 1-25 */ 
     return q + 1; 
    } 
+0

Спасибо ... :) – AceDuk

1

Иногда вам нужно научиться строить часы, иногда вам просто нужно знать время:

Const HowMany As Integer = 25  ' how many numbers do you want? 

    Dim Used As New List(Of Integer) 
    Used.Add(0)      ' position zero has 0, all other positions have a generated counting number 

    For i = 1 To HowMany 
     Dim OK As Boolean = False  ' OK becomes true when a unique number has been generated 
     Do 
      Dim num As Integer = Int((HowMany * Rnd()) + 1) 
      If Used.Contains(num) Then 
       OK = False   ' we'll try again shortly 
      Else 
       OK = True   ' this round is complete -- found a unique number 
       Used.Add(num)  ' add the generated number to the list 
      End If 
     Loop Until OK  ' in other words, loop until we've found a unique number 
    Next 

    For i = 1 To HowMany 
     MsgBox(Used(i)) ' or just use the list in however you need 
    Next 
+0

Предложение: Когда у вас есть фиксированная серия, подобная этому примеру, более эффективно просто использовать Dim Used (25) как Boolean и проверить/установить индексированные значения. Хотя это аннулируется в этом случае, так как он хочет сбросить их после факта. –

+1

Абсолютно. Для небольшого числа значений эффективность не имеет большого значения, и для простой демонстрации я пошел с одним списком, а не с массивом булевых элементов и списком/массивом результатов. Но когда количество желаемых значений становится большим, тестирование для 'Used (986) = True' будет намного быстрее, чем если код' Used.Contains' проверяет многие сотни элементов для этого конкретного значения. – ConfusionTowers

+0

Итак, код, если я могу использовать его для большего количества ярлыков?Массив лейблов? – AceDuk

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