Удалить элемент из списка после того, как я его выберу - PullRequest
0 голосов
/ 15 февраля 2020

Я хочу, чтобы мой код выбрал случайное число от 0 до 99, а затем повторил это еще 99 раз, не выбирая дубликат. Я знаю, как сделать это очень неэффективным способом (выбрать случайное число, а затем сравнить его со всеми уже выбранными числами, повторяя, если это дубликат).

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

Что мне нужно сделать:

  1. Построить «список» из 100 предметов, номера от 0 до 99.

  2. Pick 1 случайный элемент из этого списка, который удалит его из списка.

  3. Снова выберите из всего списка, на этот раз список составляет 99 элементов.

  4. Повторяйте до тех пор, пока список не станет пустым

Как это называется и какие ключевые понятия мне необходимо понять?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2020

Отвечая на мой собственный вопрос, основываясь на информации, которую я узнал из комментариев.

Вот как я это сделал, используя Коллекции:

Sub collections()
Randomize

Dim x As Byte
Dim coll As New Collection
Dim pick As Integer
Dim i As Byte: i = 1

For x = 0 To 99
    coll.Add x
Next

Do While coll.Count <> 0
    pick = Int((coll.Count - 1 + 1) * Rnd + 1)
    'Cells(i, 1).Value = coll.Item(pick)
    coll.Remove (pick)
    i = i + 1
Loop
end sub

Немного затянуто, но я хотел проверить, чтобы убедиться, что оно работает правильно (поэтому пишите в активный лист и я как счетчик).

Вот как я это сделал, используя словарь:

Sub dictionary()
Randomize

Dim dict As New Scripting.dictionary
Dim x As Byte
Dim pick As Integer
Dim i As Byte: i = 1

For x = 0 To 99
    Do
        pick = Int((99 - 0 + 1) * Rnd + 0)
    Loop Until Not dict.Exists(pick)
    dict.Add pick, 0
    'Cells(i, 4).Value = pick
    i = i + 1
Next
End Sub

И когда я сравнивал два способа сделать это, сабвуфер сборов всегда был быстрее в ~ 10 раз.

Dim StartTime As Double
Dim ElapsedTime As Double
Dim TotalTime As Double
Dim x As Byte

For x = 1 To 100
    StartTime = Timer
    Call collections
    ElapsedTime = Timer - StartTime
    TotalTime = TotalTime + ElapsedTime
Next
Debug.Print TotalTime & " Collections"

TotalTime = 0

For x = 1 To 100
    StartTime = Timer
    Call dictionary
    ElapsedTime = Timer - StartTime
    TotalTime = TotalTime + ElapsedTime
Next
Debug.Print TotalTime & " Dictionary"
0 голосов
/ 15 февраля 2020

См. 2-мерный массив с разными столбцами типов данных . Сгенерируйте от 0 до 99, затем рандомизируйте таблицу.

Все массивы одного типа.

Наборы записей - это таблицы , Это читает текстовый файл и помещает в каждую запись случайное число в виде двойного числа и строки.

Randomize 
Set rs = CreateObject("ADODB.Recordset")
With rs
    .Fields.Append "RandomNumber", 4 
    .Fields.Append "Txt", 201, 5000 
    .Open
    Do Until Inp.AtEndOfStream
        .AddNew
        .Fields("RandomNumber").value = Rnd() * 10000
        .Fields("Txt").value = Inp.readline
        .UpDate
    Loop
    .Sort = "RandomNumber"
    Do While not .EOF
        Outp.writeline .Fields("Txt").Value
        .MoveNext
    Loop
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...