Все ответы до сих пор имеют проблемы или ошибки (множественное число, а не только один). Я объясню. Но сначала я хочу дополнить понимание Дэна Тао использованием статической переменной для запоминания переменной Generator, поэтому ее многократный вызов не будет повторять одно и то же число # снова и снова, плюс он дал очень хорошее объяснение. Но у его кода был тот же недостаток, что и у большинства других, как я сейчас объясняю.
MS сделала свой метод Next () довольно странным. Параметр Min является включающим минимумом, как и следовало ожидать, но параметр Max является exclusive максимумом, как и следовало ожидать. другими словами, если вы передадите min = 1 и max = 5, то ваши случайные числа будут равны 1, 2, 3 или 4, но никогда не будут включать 5. Это первая из двух потенциальных ошибок во всем коде, которые использует метод Microsoft Random.Next ().
Для простого ответа (но все же с другими возможными, но редкими проблемами) вам нужно будет использовать:
Private Function GenRandomInt(min As Int32, max As Int32) As Int32
Static staticRandomGenerator As New System.Random
Return staticRandomGenerator.Next(min, max + 1)
End Function
(мне нравится использовать Int32
, а не Integer
, потому что он делает более понятным, насколько велик int, плюс он короче набирает, но подходит самому себе.)
Я вижу две потенциальные проблемы с этим методом, но он будет подходящим (и правильным) для большинства применений. Так что если вы хотите простое решение, я считаю, что это правильно.
Единственные 2 проблемы, которые я вижу с этой функцией:
1: когда Max = Int32.MaxValue, поэтому добавление 1 создает числовое переполнение. хотя это было бы редко, это все еще возможно.
2: когда min> max + 1. когда min = 10 и max = 5, функция Next выдает ошибку. это может быть то, что вы хотите. но это может и не быть. или рассмотрите, когда min = 5 и max = 4. путем добавления 1, 5 передается методу Next, но он не выдает ошибку, если это действительно ошибка, но код Microsoft .NET, который я протестировал, возвращает 5. так это действительно не «эксклюзивный» максимум, когда максимум = минимум. но когда max
вы можете просто поменять местами числа, когда min> max, чтобы не было ошибок, но это полностью зависит от того, что вы хотите. если вы хотите получить ошибку для недопустимых значений, то, вероятно, лучше также выдать ошибку, когда исключительный максимум Microsoft (max + 1) в нашем коде равен минимуму, где MS в этом случае не дает ошибок.
обработка обходного пути, когда max = Int32.MaxValue немного неудобно, но я ожидаю опубликовать подробную функцию, которая обрабатывает обе эти ситуации. и если вы хотите другое поведение, чем то, как я его закодировал, оденьте себя. но помните об этих 2 проблемах.
Удачного кодирования!
Edit:
Поэтому мне нужен генератор случайных целых чисел, и я решил закодировать его «правильно». Так что, если кому-то нужна полная функциональность, вот тот, который действительно работает. (Но он не выигрывает самый простой приз только с двумя строками кода. Но это не очень сложно.)
''' <summary>
''' Generates a random Integer with any (inclusive) minimum or (inclusive) maximum values, with full range of Int32 values.
''' </summary>
''' <param name="inMin">Inclusive Minimum value. Lowest possible return value.</param>
''' <param name="inMax">Inclusive Maximum value. Highest possible return value.</param>
''' <returns></returns>
''' <remarks></remarks>
Private Function GenRandomInt(inMin As Int32, inMax As Int32) As Int32
Static staticRandomGenerator As New System.Random
If inMin > inMax Then Dim t = inMin : inMin = inMax : inMax = t
If inMax < Int32.MaxValue Then Return staticRandomGenerator.Next(inMin, inMax + 1)
' now max = Int32.MaxValue, so we need to work around Microsoft's quirk of an exclusive max parameter.
If inMin > Int32.MinValue Then Return staticRandomGenerator.Next(inMin - 1, inMax) + 1 ' okay, this was the easy one.
' now min and max give full range of integer, but Random.Next() does not give us an option for the full range of integer.
' so we need to use Random.NextBytes() to give us 4 random bytes, then convert that to our random int.
Dim bytes(3) As Byte ' 4 bytes, 0 to 3
staticRandomGenerator.NextBytes(bytes) ' 4 random bytes
Return BitConverter.ToInt32(bytes, 0) ' return bytes converted to a random Int32
End Function