Random () не кажется таким уж случайным - PullRequest
0 голосов
/ 05 февраля 2020

Random() не кажется таким уж случайным, он постоянно повторяет шаблон.

Как я могу сделать это "более" случайным?

Dim ioFile As New System.IO.StreamReader("C:\names.txt")
Dim lines As New List(Of String)
Dim rnd As New Random()
Dim line As Integer
While ioFile.Peek <> -1
    lines.Add(ioFile.ReadLine())
End While
line = rnd.Next(lines.Count + 0)
NAMES.AppendText(lines(line).Trim())
ioFile.Close()
ioFile.Dispose()
Clipboard.SetText(NAMES.Text)

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Это прекрасно работает для меня. Я изменил несколько вещей, таких как реализация блока using, удалил избыточное добавление 0 и добавил al oop для 100-кратного тестирования для отладки. выборка из 200, которую вы просто «зрелище», недостаточна, чтобы сказать, что случайная последовательность «не работает».

Using ioFile As New System.IO.StreamReader("C:\names.txt")
        Dim lines As New List(Of String)
        Dim rnd As New Random()
        Dim line As Integer
        While ioFile.Peek <> -1
            lines.Add(ioFile.ReadLine())
        End While
        For i As Integer = 1 To 100
            line = rnd.Next(lines.Count)
            Debug.WriteLine(lines(line).Trim())

        Next

End Using
0 голосов
/ 06 февраля 2020

Вам не нужен потоковый ридер для чтения текстового файла. File.ReadAllLines вернет массив строк в файле. Вызов .ToList для этого метода дает вам желаемое List(Of String)

. Мы будем l oop по всей длине списка в течение l oop. Мы вычитаем один, потому что индексы начинаются с нуля.

Чтобы получить случайный индекс, мы вызываем .Next в нашем экземпляре класса Random, который был объявлен вне метода (переменная уровня формы). Метод .Next включает первую переменную и является эксклюзивным. второй. Я использовал переменную для хранения исходного значения lines.Count, потому что это значение изменится в l oop и будет зависать для l oop, если мы использовали lines.Count -1 непосредственно в To части For.

Как только мы получим случайный индекс, мы добавим эту строку в TextBox и удалим ее из списка.

Private Sub ShuffleNames()
    Dim index As Integer
    Dim lines = File.ReadAllLines("C:\Users\xxx\Desktop\names.txt").ToList
    Dim loopLimit = lines.Count - 1
    For i = 0 To loopLimit
        index = rnd.Next(0, lines.Count)
        TextBox1.AppendText(lines(index).Trim & Environment.NewLine)
        lines.RemoveAt(index)
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...