Случайное целое число в VB.NET

Мне нужно сгенерировать случайное целое число от 1 до n (где n - положительное целое число) для использования в модульном тесте. Мне не нужно что-то слишком сложное, чтобы гарантировать истинную случайность - просто старомодное случайное число.

Как бы я это сделал?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
62
0
329 292
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Ответ принят как подходящий

Чтобы получить случайное целочисленное значение от 1 до N (включительно), вы можете использовать следующее.

CInt(Math.Ceiling(Rnd() * n)) + 1
«от 1 до N (включительно)» wrong, will return a value between 0 and N. Math.Ceiling(0) is 0.
Qtax 19.07.2012 01:09

Rnd () может вернуть 0. Если это произойдет, то даже при n> 0 результатом будет 0. Таким образом, это может привести к очень неприятной ошибке, особенно из-за того, что она встречается очень редко. если вам нужен код с ошибками, используйте это. Документация MS гласит: «Функция Rnd возвращает значение меньше 1, но больше или равно нулю». msdn.microsoft.com/en-us/library/f7s023d2(v=vs.90).aspx

Shawn Kovac 30.01.2014 19:10

Пробовал это как есть и столкнулся с экземпляром 12 при использовании n = 11. Не включительно. У MSDN есть лучший пример: randomValue = CInt (Math.Floor ((верхняя граница - нижняя граница + 1) * Rnd ())) + нижняя граница

eric1825 19.12.2014 21:27

Rnd() является частью [0; 1 [. Если вам нужна числовая часть] 0; 1], вы можете использовать 1-Rnd().

Ama 17.05.2019 20:31

Public Function RandomNumber(ByVal n As Integer) As Integer
    'initialize random number generator
    Dim r As New Random(System.DateTime.Now.Millisecond)
    Return r.Next(1, n)
End Function

если вам нужны ошибки, то используйте этот код. MS сделала свой метод Next () довольно странным. параметр Min - это включающий минимум, как и следовало ожидать, но параметр Max - это исключительный максимум, чего НЕ ожидалось. Другими словами, если вы передадите min = 1 и max = 5, тогда ваши случайные числа будут любыми из 1, 2, 3 или 4, но никогда не будут включать 5.

Shawn Kovac 30.01.2014 20:31

@ShawnKovac Так реализовано большинство генераторов случайных чисел.

Bill the Lizard 30.01.2014 21:53

Используйте System.Random:

Dim MyMin As Integer = 1, MyMax As Integer = 5, My1stRandomNumber As Integer, My2ndRandomNumber As Integer

' Create a random number generator
Dim Generator As System.Random = New System.Random()

' Get a random number >= MyMin and <= MyMax
My1stRandomNumber = Generator.Next(MyMin, MyMax + 1) ' Note: Next function returns numbers _less than_ max, so pass in max + 1 to include max as a possible value

' Get another random number (don't create a new generator, use the same one)
My2ndRandomNumber = Generator.Next(MyMin, MyMax + 1)

Выглядит проще с return New Random (). Next (minValue, maxValue)

Ignacio Soler Garcia 02.02.2010 13:25

Истинный. Однако, если пользователю нужна последовательность случайных чисел (а не только одно), они захотят сохранить ссылку Random.

Joseph Sturtevant 03.02.2010 03:01

Измените Dim Generator на Static Generator, и у вас есть экземпляр, который вы можете сохранить (не поточно-ориентированный, но это не будет иметь значения в большинстве реалистичных сценариев).

Dan Tao 20.04.2010 22:50

это выглядит проще, но этот код явно неверен. если вам нужен баг, то используйте этот код. MS сделала свой метод Next () довольно странным. параметр Min - это включающий минимум, как и следовало ожидать, но параметр Max - это минимум эксклюзивный, чего НЕ ожидалось. Другими словами, если вы передадите min = 1 и max = 5, тогда ваши случайные числа будут любыми из 1, 2, 3 или 4, но никогда не будут включать 5.

Shawn Kovac 30.01.2014 19:15

@ShawnKovac - Хороший улов. Я не заметил инклюзивного \ исключительного несоответствия между параметрами min и max в Random.Next. Образец кода обновлен.

Joseph Sturtevant 01.02.2014 23:27

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

Public Function GetRandom(ByVal Min As Integer, ByVal Max As Integer) As Integer
    Dim Generator As System.Random = New System.Random()
    Return Generator.Next(Min, Max)
End Function

Причина в том, что конструктор класса Random предоставляет начальное значение по умолчанию на основе системных часов. В большинстве систем это имеет ограниченную степень детализации - где-то около 20 мс. Итак, если вы напишете следующий код, вы получите одно и то же число несколько раз подряд:

Dim randoms(1000) As Integer
For i As Integer = 0 to randoms.Length - 1
    randoms(i) = GetRandom(1, 100)
Next

Следующий код решает эту проблему:

Public Function GetRandom(ByVal Min As Integer, ByVal Max As Integer) As Integer
    ' by making Generator static, we preserve the same instance '
    ' (i.e., do not create new instances with the same seed over and over) '
    ' between calls '
    Static Generator As System.Random = New System.Random()
    Return Generator.Next(Min, Max)
End Function

Я собрал простую программу, используя оба метода, для генерации 25 случайных целых чисел от 1 до 100. Вот результат:

Non-static: 70 Static: 70
Non-static: 70 Static: 46
Non-static: 70 Static: 58
Non-static: 70 Static: 19
Non-static: 70 Static: 79
Non-static: 70 Static: 24
Non-static: 70 Static: 14
Non-static: 70 Static: 46
Non-static: 70 Static: 82
Non-static: 70 Static: 31
Non-static: 70 Static: 25
Non-static: 70 Static: 8
Non-static: 70 Static: 76
Non-static: 70 Static: 74
Non-static: 70 Static: 84
Non-static: 70 Static: 39
Non-static: 70 Static: 30
Non-static: 70 Static: 55
Non-static: 70 Static: 49
Non-static: 70 Static: 21
Non-static: 70 Static: 99
Non-static: 70 Static: 15
Non-static: 70 Static: 83
Non-static: 70 Static: 26
Non-static: 70 Static: 16
Non-static: 70 Static: 75

я думаю, что это никогда не даст "100". это между min и меньше, чем MaxValue на самом деле (я думаю)

Max Hodges 11.04.2012 17:29

@maxhodges: Думаю, ты прав. В слове «между» есть досадная двусмысленность; Я не знаю, заботится ли OP о том, включено ли 100 или нет. Лично я этого не делал; мой ответ был предназначен только для иллюстрации совместного использования объекта Random между несколькими вызовами функций с использованием ключевого слова Static.

Dan Tao 11.04.2012 17:56

Я обнаружил, что мне нужно ссылаться на этот код более одного раза. Спасибо!

MonkeyDoug 30.06.2013 21:53

Я бы поставил +1 вам за статистику, но в коде есть ошибки. но слава за это статичное понимание! и я бы тебе -1 за ошибочный ответ. но они даже выходят.

Shawn Kovac 30.01.2014 19:24

если вам нужен баг, то используйте этот код. MS сделала свой метод Next () довольно странным. параметр Min - это включающий минимум, как и следовало ожидать, но параметр Max - это исключительный минимум, чего НЕ ожидалось. Другими словами, если вы передадите min = 1 и max = 5, тогда ваши случайные числа будут любыми из 1, 2, 3 или 4, но никогда не будут включать 5.

Shawn Kovac 30.01.2014 19:24

@ShawnKovac: Я понимаю, что это может быть удивительно. Но называть его «глючным» - это, на мой взгляд, перебор; это просто не то поведение, которого ожидал ты. На самом деле большинство реализаций случайных чисел (о которых я знаю) работают следующим образом: включающая нижняя граница, исключительная верхняя граница. Это может быть удобно во многих распространенных случаях использования, таких как выбор случайного элемента из массива (где вы выбираете элемент между 0 и array.length).

Dan Tao 30.01.2014 19:37

Например: Random.nextInt в Java, Math.random в JavaScript, rand в Ruby и т. д.

Dan Tao 30.01.2014 19:39

спасибо Дэн. я ценю эту обратную связь. в лучшем случае это неудобно, а потом я вижу программистов, которые думают, что «минимум» и «максимум» имеют постоянное сходство как инклюзивные и исключительные ... да, как и я. но это по-человечески. столько «причуд» в программировании - вот почему программирование так сложно. и нам просто нужно написать лучший код. я благодарен за ваш отзыв. Благодарю.

Shawn Kovac 30.01.2014 20:37

Я считаю, что то, что я бы назвал не ошибочным и не причудливым, но даже качественным кодом, - это если бы переменные были просто названы так, чтобы отражать четко, чем они являются: incMin и excMax были бы возможными короткими именами. :) и, возможно, комментарий, который incMin = включая минимум & excMax = исключительный максимум.

Shawn Kovac 30.01.2014 20:37

@dantao: я очень благодарен за ваш отзыв. спасибо за то, что открываю мой разум немного больше (по крайней мере, насколько я позволяю себе видеть это по-другому). ;) Я назвал свои переменные в своем «фиксированном коде», чтобы другие программисты, которые могут увидеть мой код позже, не были сбиты с толку, если бы они ожидали такого «причудливого» поведения (которое, на мой взгляд, все еще содержит ошибки, поскольку не последовательное использование обоих параметров (включающее или исключающее). мой метод использует инклюзивные пределы для обоих параметров, что также позволяет получить максимальный, полный диапазон int в качестве результата, как я считаю, это должно быть закодировано.

Shawn Kovac 30.01.2014 20:47

@ShawnKovac: Вы не одиноки. Например, Python random.randint включает оба конца. И я согласен с вами, что имена переменных min и max, вероятно, должны быть более явными (на самом деле вы можете видеть, что я упоминал двусмысленность в моем предыдущем комментарии от апреля 2012 года!). Я предполагаю, что один из более сложных вопросов при разработке интерфейса заключается в следующем: пытаетесь ли вы сделать его интуитивно понятным «в вакууме», или вы опираетесь на ожидания разработчиков из того, что было раньше?

Dan Tao 30.01.2014 20:52

@ShawnKovac: индексирование массива на основе 0 - прекрасный пример. Возможно, это не "интуитивно" (для некоторых, по крайней мере, поначалу), но оно настолько широко распространено, что теперь, если бы вы создали новый язык, который использовал бы индексирование на основе 1, вы бы фактически сюрприз многие разработчики. Таким образом, неинтуитивное может стать интуитивным на основе предыдущего опыта. Мне кажется, что Random.Next в .NET находится где-то в серой зоне. Множество разработчиков (таких как вы) наверняка находят это удивительным, но я предполагаю, что есть также немало тех, кто ожидает именно такого поведения.

Dan Tao 30.01.2014 20:54

да, я понимаю питание для обратного использования. Забавно, что я думал о максимальном индексе VB, когда объявление массива противоречит интуиции из-за «ожидаемого» объявления в стиле C, которое так часто встречается. но вы правы, большая картина - это проблема с нулевой индексацией. вы очень правы. теперь мы привыкли к этому, и было бы более неудобно использовать индексирование на основе 1 ... теперь, когда я к этому привык. Я считаю, что это именно ваша точка зрения. спасибо за эти очки и поделитесь своей мудростью! Метод VB Instr () также является хорошим примером с индексированием на основе 1. Что ж, я думаю, что одно можно сказать наверняка - это со временем меняться. :)

Shawn Kovac 30.01.2014 21:01

Я изменил функцию следующим образом: Public Function GetRandom (ByVal Min As Integer, ByVal Max As Integer) As Integer «сделав генератор статическим, мы сохраняем тот же экземпляр» (т. Е. Не создавайте новые экземпляры с одним и тем же начальным числом поверх и over) '' между вызовами 'Static Generator As System.Random = New System.Random () Dim Result as Integer = Generator.Next (Min, Max) if Result = Max then result - = 1 End Function I then pass 1 more than Максимум, который я хочу (например, если я хочу максимум 255, я передаю 256 как максимум).

SEFL 24.11.2016 20:40

Вы всегда можете добавить числа в список, затем проверить список с помощью «содержит» и добавить номер только в том случае, если его еще нет. 5 из 10 возможных были бы довольно быстрыми, даже если бы на этом пути было несколько дубликатов. Используйте список для массива, если он действительно должен быть в массиве.

Robert Quinn 06.05.2018 18:19

Сработало отлично с 1-го раза. Спасибо.

user1000008 16.02.2021 22:35

Function xrand() As Long
        Dim r1 As Long = Now.Day & Now.Month & Now.Year & Now.Hour & Now.Minute & Now.Second & Now.Millisecond
        Dim RAND As Long = Math.Max(r1, r1 * 2)
        Return RAND
End Function

[BBOYSE] Это лучший способ с нуля: P

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

Shawn Kovac 30.01.2014 19:33

Если вы используете ответ Джозефа, который является отличным ответом, и вы повторяете их подряд следующим образом:

dim i = GetRandom(1, 1715)
dim o = GetRandom(1, 1715)

Тогда результат может быть один и тот же снова и снова, потому что он так быстро обрабатывает вызов. Возможно, это не было проблемой в '08, но поскольку процессоры сегодня намного быстрее, функция не позволяет системным часам достаточно времени измениться до выполнения второго вызова.

Поскольку функция System.Random () основана на системных часах, нам нужно дать достаточно времени для ее изменения до следующего вызова. Один из способов сделать это - приостановить текущий поток на 1 миллисекунду. См. Пример ниже:

Public Function GetRandom(ByVal min as Integer, ByVal max as Integer) as Integer
    Static staticRandomGenerator As New System.Random
    max += 1
    Return staticRandomGenerator.Next(If(min > max, max, min), If(min > max, min, max))
End Function

если вам нужен баг, то используйте этот код. MS сделала свой метод Next () довольно странным. параметр Min - это включающий минимум, как и следовало ожидать, но параметр Max - это исключительный минимум, чего НЕ ожидалось. Другими словами, если вы передадите min = 1 и max = 5, тогда ваши случайные числа будут любыми из 1, 2, 3 или 4, но никогда не будут включать 5.

Shawn Kovac 30.01.2014 19:26

@ShawnKovac Спасибо, что просветили меня о функции .Next, не возвращающей максимальное число, и об использовании статического объекта system.random (хотя имена Min и Max, вероятно, больше не подходят, так как теперь это просто диапазон: от A до B ). Я сделал тест, и производительность у них одинаковая. Кроме того, я использую целое число вместо int32, потому что в настоящее время он привязан к int32 (что делает их почти одинаковыми), и, поскольку я много работаю с SQL, мне нравится синтаксис, и я не против набрать 'e' перед моим ' таб. (Но каждому свое.) ~ Ура

Rogala 21.03.2014 23:16

спасибо, что исправили свой код. в этом вы намного превосходите многих других людей. Да, Int32 и Integer дают одинаковый эффект, насколько я знаю, точно такой же. За исключением меня, Int32 более понятен для людей, которые не знают, какой размер Integer и Ingeger. Это основная причина, по которой я использую Int32. Но я понимаю, что это полностью вопрос предпочтений.

Shawn Kovac 27.03.2014 20:06

Мне также нравится более короткий псевдоним Int32, и да, с интеллектом типизация примерно такая же. Но мне тоже нравится более компактное чтение. Но когда я кодирую C#, мне все равно нравится использовать более конкретный Int32, а не его еще более короткий int, на случай, если новички смотрят на мой код, для ясности других людей. Но каждому свое. :)

Shawn Kovac 27.03.2014 20:08

Я просто хочу указать, что ваш код либо выдаст ошибку, либо выдаст ошибку, если ваш max = Integer.MaxValue. Конечно, обычно это не имеет значения, но если вы хотите устранить эту потенциальную проблему, вы можете увидеть мой ответ, в котором я предоставил решение для предоставления полного диапазона случайного Int, если пользователь хотел включить Integer.MaxValue. К сожалению, Microsoft просто не упростила создание очень надежного кода для этого, когда они реализовали то, что я называю чрезвычайно причудливой случайной функцией. Трудно найти действительно надежный код. :(

Shawn Kovac 27.03.2014 20:11

Во всех ответах пока есть проблемы или ошибки (во множественном числе, а не только в одном). Я объясню. Но сначала я хочу похвалить идею Дэна Тао об использовании статической переменной для запоминания переменной Generator, поэтому при ее многократном вызове не будет повторяться один и тот же # снова и снова, плюс он дал очень хорошее объяснение. Но в его коде был тот же недостаток, что и у большинства других, как я сейчас объясняю.

MS сделала свой метод Next () довольно странным. параметр Min - это включающий минимум, как и следовало ожидать, но параметр Max - это максимум эксклюзивный, чего НЕ ожидалось. Другими словами, если вы передадите 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. поэтому это действительно не «исключительный» максимум, когда максимум = минимум. но когда макс

вы можете просто поменять местами числа, когда min> max, чтобы не возникало ошибок, но это полностью зависит от того, что вы хотите. если вам нужна ошибка при недопустимых значениях, то, вероятно, лучше также выдать ошибку, когда исключительный максимум Microsoft (max + 1) в нашем коде равен минимуму, когда MS в этом случае не выдаст ошибку.

обработка временного решения, когда max = Int32.MaxValue немного неудобна, но я ожидаю опубликовать подробную функцию, которая обрабатывает обе эти ситуации. и если вы хотите, чтобы поведение отличалось от того, как я его закодировал, подойдите сами. но имейте в виду эти 2 проблемы.

Удачного кодирования!

Редактировать: Так что мне понадобился генератор случайных целых чисел, и я решил «правильно» его закодировать. Так что, если кому-то нужна полная функциональность, вот тот, который действительно работает. (Но это не самый простой приз с двумя строчками кода. Но и не очень сложный.)

''' <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

Ерунда полная. Как сказал Билл, поведение Next() вполне нормально, а не «странно».

Lightness Races in Orbit 17.09.2015 17:39

Честно говоря, как бы «нормально» это ни было для встроенных функций различных языков программирования, на самом деле это довольно странно для остального мира. Когда вы в последний раз слышали, что 1D6 дает вам число от 1 до 7? Для тех, кто внимательно не читал документацию по языку и не особенно знаком с обычно странным поведением функций ГСЧ, они могут быть удивлены и на самом деле не знают, что произошло.

MichaelS 28.12.2015 10:22

@MichaelS, ты потерял меня с '1D6' с # между 1 и 7. Я не понимаю твою 'D'. Но также в отношении 2 того, как работает Microsoft Random.Next (min, max), программа предоставляет 1 и 7, а метод возвращает # в диапазоне 1 и 6. Так что я думаю, что вы немного отклонились от точной точности вашего аналогия (если вы не имели в виду какое-то другое бессмысленное поведение. Но если вы намеревались сослаться на Microsoft, я просто скажу, что ваша небольшая путаница - это совершенно нормальный, потому что то, что сделала MS, не имеет логического смысла (кроме того, что указывали другие : что это стало новой «нормой»).

Shawn Kovac 29.12.2015 16:09

И я просто озвучиваю немного логики, что с точки зрения логики лучше использовать инклюзивный минимум и инклюзивный максимум для согласованности и отклонить начавшуюся квази-«норму». Вот и все. :)

Shawn Kovac 29.12.2015 16:11

1D6 означает бросок одного шестигранного кубика, который используется во многих настольных играх или настольных ролевых играх. Числа варьируются от 1 до 6 включительно, и люди сказали бы «от 1 до 6», а не «от 1 до 7», и предположили бы, что вы знаете, что 7 не включено. Вы можете использовать аналогии из многих других аспектов жизни. Если я говорю, что бейсбольная лига предназначена для детей от 12 до 14 лет, я включаю и 12, и 14. И т.д. Я не могу придумать практического примера исключения верхней границы диапазона за пределами математического класса.

MichaelS 04.01.2016 07:57

Хорошо, @MichaelS, теперь, когда я понял ваш пост, я вижу, что мы с вами полностью согласны. Вы только что выразили ту же концепцию по-другому. Хороший момент. :) Благодарю за разъяснение.

Shawn Kovac 11.01.2016 20:55

Dim rnd As Random = New Random
rnd.Next(n)

Вы должны создать генератор псевдослучайных чисел только один раз:

Dim Generator As System.Random = New System.Random()

Затем, если для ваших нужд достаточно целого числа, вы можете использовать:

Public Function GetRandom(myGenerator As System.Random, ByVal Min As Integer, ByVal Max As Integer) As Integer
'min is inclusive, max is exclusive (dah!)
Return myGenerator.Next(Min, Max + 1)
End Function

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

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

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

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

Пример Microsoft Функция Rnd

https://msdn.microsoft.com/en-us/library/f7s023d2%28v=vs.90%29.aspx

1- Инициализировать генератор случайных чисел.

Randomize()

2 - Сгенерировать случайное значение от 1 до 6.

Dim value As Integer = CInt(Int((6 * Rnd()) + 1))

Просто для справки, определение функции VB NET для RANDOM и RANDOMIZE (которое должно давать те же результаты, что и BASIC (1980-е годы) и все версии после него:

Public NotInheritable Class VBMath
    ' Methods
    Private Shared Function GetTimer() As Single
        Dim now As DateTime = DateTime.Now
        Return CSng((((((60 * now.Hour) + now.Minute) * 60) + now.Second) + (CDbl(now.Millisecond) / 1000)))
    End Function

    Public Shared Sub Randomize()
        Dim timer As Single = VBMath.GetTimer
        Dim projectData As ProjectData = ProjectData.GetProjectData
        Dim rndSeed As Integer = projectData.m_rndSeed
        Dim num3 As Integer = BitConverter.ToInt32(BitConverter.GetBytes(timer), 0)
        num3 = (((num3 And &HFFFF) Xor (num3 >> &H10)) << 8)
        rndSeed = ((rndSeed And -16776961) Or num3)
        projectData.m_rndSeed = rndSeed
    End Sub

    Public Shared Sub Randomize(ByVal Number As Double)
        Dim num2 As Integer
        Dim projectData As ProjectData = ProjectData.GetProjectData
        Dim rndSeed As Integer = projectData.m_rndSeed
        If BitConverter.IsLittleEndian Then
            num2 = BitConverter.ToInt32(BitConverter.GetBytes(Number), 4)
        Else
            num2 = BitConverter.ToInt32(BitConverter.GetBytes(Number), 0)
        End If
        num2 = (((num2 And &HFFFF) Xor (num2 >> &H10)) << 8)
        rndSeed = ((rndSeed And -16776961) Or num2)
        projectData.m_rndSeed = rndSeed
    End Sub

    Public Shared Function Rnd() As Single
        Return VBMath.Rnd(1!)
    End Function

    Public Shared Function Rnd(ByVal Number As Single) As Single
        Dim projectData As ProjectData = ProjectData.GetProjectData
        Dim rndSeed As Integer = projectData.m_rndSeed
        If (Number <> 0) Then
            If (Number < 0) Then
                Dim num1 As UInt64 = (BitConverter.ToInt32(BitConverter.GetBytes(Number), 0) And &HFFFFFFFF)
                rndSeed = CInt(((num1 + (num1 >> &H18)) And CULng(&HFFFFFF)))
            End If
            rndSeed = CInt((((rndSeed * &H43FD43FD) + &HC39EC3) And &HFFFFFF))
        End If
        projectData.m_rndSeed = rndSeed
        Return (CSng(rndSeed) / 1.677722E+07!)
    End Function

End Class

В то время как Случайный КЛАСС:

Public Class Random
    ' Methods
    <__DynamicallyInvokable> _
    Public Sub New()
        Me.New(Environment.TickCount)
    End Sub

    <__DynamicallyInvokable> _
    Public Sub New(ByVal Seed As Integer)
        Me.SeedArray = New Integer(&H38  - 1) {}
        Dim num4 As Integer = If((Seed = -2147483648), &H7FFFFFFF, Math.Abs(Seed))
        Dim num2 As Integer = (&H9A4EC86 - num4)
        Me.SeedArray(&H37) = num2
        Dim num3 As Integer = 1
        Dim i As Integer
        For i = 1 To &H37 - 1
            Dim index As Integer = ((&H15 * i) Mod &H37)
            Me.SeedArray(index) = num3
            num3 = (num2 - num3)
            If (num3 < 0) Then
                num3 = (num3 + &H7FFFFFFF)
            End If
            num2 = Me.SeedArray(index)
        Next i
        Dim j As Integer
        For j = 1 To 5 - 1
            Dim k As Integer
            For k = 1 To &H38 - 1
                Me.SeedArray(k) = (Me.SeedArray(k) - Me.SeedArray((1 + ((k + 30) Mod &H37))))
                If (Me.SeedArray(k) < 0) Then
                    Me.SeedArray(k) = (Me.SeedArray(k) + &H7FFFFFFF)
                End If
            Next k
        Next j
        Me.inext = 0
        Me.inextp = &H15
        Seed = 1
    End Sub

    Private Function GetSampleForLargeRange() As Double
        Dim num As Integer = Me.InternalSample
        If ((Me.InternalSample Mod 2) = 0) Then
            num = -num
        End If
        Dim num2 As Double = num
        num2 = (num2 + 2147483646)
        Return (num2 / 4294967293)
    End Function

    Private Function InternalSample() As Integer
        Dim inext As Integer = Me.inext
        Dim inextp As Integer = Me.inextp
        If (++inext >= &H38) Then
            inext = 1
        End If
        If (++inextp >= &H38) Then
            inextp = 1
        End If
        Dim num As Integer = (Me.SeedArray(inext) - Me.SeedArray(inextp))
        If (num = &H7FFFFFFF) Then
            num -= 1
        End If
        If (num < 0) Then
            num = (num + &H7FFFFFFF)
        End If
        Me.SeedArray(inext) = num
        Me.inext = inext
        Me.inextp = inextp
        Return num
    End Function

    <__DynamicallyInvokable> _
    Public Overridable Function [Next]() As Integer
        Return Me.InternalSample
    End Function

    <__DynamicallyInvokable> _
    Public Overridable Function [Next](ByVal maxValue As Integer) As Integer
        If (maxValue < 0) Then
            Dim values As Object() = New Object() { "maxValue" }
            Throw New ArgumentOutOfRangeException("maxValue", Environment.GetResourceString("ArgumentOutOfRange_MustBePositive", values))
        End If
        Return CInt((Me.Sample * maxValue))
    End Function

    <__DynamicallyInvokable> _
    Public Overridable Function [Next](ByVal minValue As Integer, ByVal maxValue As Integer) As Integer
        If (minValue > maxValue) Then
            Dim values As Object() = New Object() { "minValue", "maxValue" }
            Throw New ArgumentOutOfRangeException("minValue", Environment.GetResourceString("Argument_MinMaxValue", values))
        End If
        Dim num As Long = (maxValue - minValue)
        If (num <= &H7FFFFFFF) Then
            Return (CInt((Me.Sample * num)) + minValue)
        End If
        Return (CInt(CLng((Me.GetSampleForLargeRange * num))) + minValue)
    End Function

    <__DynamicallyInvokable> _
    Public Overridable Sub NextBytes(ByVal buffer As Byte())
        If (buffer Is Nothing) Then
            Throw New ArgumentNullException("buffer")
        End If
        Dim i As Integer
        For i = 0 To buffer.Length - 1
            buffer(i) = CByte((Me.InternalSample Mod &H100))
        Next i
    End Sub

    <__DynamicallyInvokable> _
    Public Overridable Function NextDouble() As Double
        Return Me.Sample
    End Function

    <__DynamicallyInvokable> _
    Protected Overridable Function Sample() As Double
        Return (Me.InternalSample * 4.6566128752457969E-10)
    End Function


    ' Fields
    Private inext As Integer
    Private inextp As Integer
    Private Const MBIG As Integer = &H7FFFFFFF
    Private Const MSEED As Integer = &H9A4EC86
    Private Const MZ As Integer = 0
    Private SeedArray As Integer()
End Class

Другие вопросы по теме