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

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

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

20.08.2008 19:54:00
11 ОТВЕТОВ
РЕШЕНИЕ

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

CInt(Math.Ceiling(Rnd() * n)) + 1
58
1.12.2014 22:12:35
«между 1 и N (включительно)» неправильно, вернет значение между 0и N. Math.Ceiling(0)есть 0.
Qtax 18.07.2012 21:09:58
Rnd () может вернуть 0. Если это произойдет, то даже если n> 0, результат будет 0. Таким образом, это даст очень неприятную ошибку, особенно потому, что это очень редко. если вы хотите глючный код, используйте это. Документация MS гласит: «Функция Rnd возвращает значение меньше 1, но больше или равно нулю». msdn.microsoft.com/en-us/library/f7s023d2(v=vs.90).aspx
Shawn Kovac 30.01.2014 15:10:17
Пробовал это как есть и столкнулся с экземпляром 12 при использовании n = 11. Не включительно MSDN имеет лучший пример: randomValue = CInt (Math.Floor ((верхняя граница - нижняя граница + 1) * Rnd ())) + нижняя граница
eric1825 19.12.2014 18:27:57
Rnd()является частью [0; 1 [. Если вам нужна часть числа] 0; 1], вы можете использовать 1-Rnd().
Ama 17.05.2019 17:31:02
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
4
20.04.2010 18:46:59
если вы хотите ошибки, используйте этот код. MS сделал их метод Next () довольно странным. Параметр Min является включающим минимумом, как и следовало ожидать, но параметр Max является исключительным максимумом, как и следовало ожидать. другими словами, если вы передадите min = 1 и max = 5, то ваши случайные числа будут равны 1, 2, 3 или 4, но никогда не будут включать 5.
Shawn Kovac 30.01.2014 16:31:00
@ShawnKovac Вот как реализованы большинство генераторов случайных чисел.
Bill the Lizard 30.01.2014 17:53:28

Используйте 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)
34
1.02.2014 19:42:07
Выглядит проще с возвращением New Random (). Next (minValue, maxValue)
Ignacio Soler Garcia 2.02.2010 10:25:35
Правда. Однако, если пользователь хочет получить последовательность случайных чисел (а не только одно), он захочет сохранить ссылку на случайный номер.
Joseph Sturtevant 3.02.2010 00:01:01
Перейдите Dim Generatorна Static Generatorи у вас есть экземпляр, который вы можете сохранить (не потокобезопасный, но в большинстве реалистичных сценариев это не имеет значения).
Dan Tao 20.04.2010 18:50:54
это выглядит проще, но этот код явно неправильный. если вы хотите ошибку, используйте этот код. MS сделал их метод Next () довольно странным. Параметр Min является включающим минимумом, как и следовало ожидать, но параметр Max является исключительным минимумом, как и следовало ожидать. другими словами, если вы передадите min = 1 и max = 5, то ваши случайные числа будут равны 1, 2, 3 или 4, но никогда не будут включать 5.
Shawn Kovac 30.01.2014 15:15:01
@ShawnKovac - Хороший улов. Я не заметил включающего \ исключающего несоответствия между параметрами min и max Random.Next. Образец кода обновлен.
Joseph Sturtevant 1.02.2014 19:27:29

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

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
72
20.04.2010 19:03:28
Я думаю, что это никогда не будет генерировать «100». на самом деле это между мин и меньше, чем MaxValue (я думаю)
Max Hodges 11.04.2012 13:29:47
@maxhodges: Да, я думаю, что ты прав. В слове «между» есть печальная двусмысленность; Я не знаю, волнует ли ОП, 100 или нет. Я не лично; Мой ответ был предназначен только для иллюстрации совместного использования Randomобъекта несколькими вызовами функций с использованием Staticключевого слова.
Dan Tao 11.04.2012 13:56:03
если вы хотите ошибку, используйте этот код. MS сделал их метод Next () довольно странным. Параметр Min является включающим минимумом, как и следовало ожидать, но параметр Max является исключительным минимумом, как и следовало ожидать. другими словами, если вы передадите min = 1 и max = 5, то ваши случайные числа будут равны 1, 2, 3 или 4, но никогда не будут включать 5.
Shawn Kovac 30.01.2014 15:24:52
@ShawnKovac: Я могу оценить, что это может быть удивительно. Но, на мой взгляд, называть его «глючным» немного излишне; это было не то поведение, которого вы ожидали. Правда в том, что большинство реализаций случайных чисел (которые я знаю) работают следующим образом: включающая нижняя граница, исключительная верхняя граница. Это может быть удобно во многих общих случаях использования, таких как выбор случайного элемента из массива (где вы выбираете элемент между 0и array.length).
Dan Tao 30.01.2014 15:37:26
спасибо Дэн. Я ценю этот отзыв. в лучшем случае это неловко, и затем я вижу программистов, которые думают, что «минимум» и «максимум» имеют постоянное сходство как включающее и исключающее ... да, как и я. но это человек. так много «причуд» в программировании, поэтому программирование так же сложно, как и есть. и нам просто нужно написать лучший код. Я ценю ваши отзывы, хотя. Спасибо.
Shawn Kovac 30.01.2014 16:37:05
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

-5
12.11.2013 22:23:35
это ужасно это совсем не случайно. это только предварительно вычисленное число, основанное на времени. это не будет проявлять какие-либо свойства случайного числа. плюс это не отвечает на вопрос. вопрос был не в том, как сгенерировать какое-либо случайное число, а в одном от 1 до заданного значения.
Shawn Kovac 30.01.2014 15:33:20

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

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
1
21.03.2014 18:59:02
если вы хотите ошибку, используйте этот код. MS сделал их метод Next () довольно странным. Параметр Min является включающим минимумом, как и следовало ожидать, но параметр Max является исключительным минимумом, как и следовало ожидать. другими словами, если вы передадите min = 1 и max = 5, то ваши случайные числа будут равны 1, 2, 3 или 4, но никогда не будут включать 5.
Shawn Kovac 30.01.2014 15:26:35
@ShawnKovac Спасибо за то, что просветили меня о том, что функция .Next не возвращает число Max и использование статического объекта system.random (хотя имена Min и Max, вероятно, больше не подходят, поскольку теперь это просто диапазон: от A до B ). Я сделал тест, и производительность двух одинакова. Кроме того, я использую целое число вместо int32, потому что оно в настоящее время связано с int32 (что делает их почти одинаковыми), и, поскольку я много работаю с SQL, мне нравится синтаксис, и я не против набрать 'e' перед моим ' вкладка «. (Каждому свое, хотя.) ~ Приветствия
Rogala 21.03.2014 19:16:04
спасибо за заботу исправить ваш код. Вы намного превосходите других людей в этом. Да, Int32 и Integer производят одинаковый эффект, насколько я знаю, точно так же. Кроме меня, Int32 более понятен для людей, которые не знают, что такое размер Integer и Ingeger. Это самая большая причина, по которой я использую Int32. Но я понимаю, что это совершенно предпочтительная вещь.
Shawn Kovac 27.03.2014 16:06:56
Мне также нравится более короткий псевдоним Int32, и да, при интеллигенции типизация примерно одинакова. Но мне также нравится более компактное чтение. Но когда я пишу код на C #, я все же предпочитаю использовать более конкретный Int32, а не его даже более короткое «int» в случае, если новички смотрят на мой код, для ясности других людей. Но каждому свое. :)
Shawn Kovac 27.03.2014 16:08:35
Я просто хочу указать, что ваш код будет либо содержать ошибку, либо выдавать ошибку, если ваш max = Integer.MaxValue. Конечно, это обычно не имеет значения, но если вы хотите устранить эту потенциальную проблему, вы можете увидеть мой ответ, где я предоставил решение, чтобы дать полный диапазон случайных Int, если пользователь хотел включить Integer.MaxValue. К сожалению, Microsoft просто не упростила создание очень надежного кода для этого, когда они реализовали то, что я называю чрезвычайно странной случайной функцией. Трудно найти действительно надежный код. :(
Shawn Kovac 27.03.2014 16:11:52

Все ответы до сих пор имеют проблемы или ошибки (множественное число, а не только один). Я объясню. Но сначала я хочу дополнить понимание Дэна Тао использованием статической переменной для запоминания переменной 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. так это действительно не «эксклюзивный» максимум, когда максимум = минимум. но когда max <min для функции Random.Next (), она генерирует исключение ArgumentOutOfRangeException. поэтому реализация Microsoft действительно противоречива и ошибочна в этом отношении.

вы можете просто поменять местами числа, когда 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
5
30.01.2014 17:06:54
Полная чушь. Как сказал Билл, поведение Next()вполне нормальное, а не «довольно странное».
Lightness Races in Orbit 17.09.2015 14:39:59
Чтобы быть справедливым, как бы «нормально» это ни было для встроенных функций различных языков программирования, на самом деле это довольно странно для остального мира. Когда в последний раз вы слышали, как кто-то говорит, что 1D6 дает вам число от 1 до 7? Для тех, кто не внимательно прочитал документацию по языку и не особенно знаком с обычно странным поведением функций ГСЧ, они могут быть удивлены и не знают, что на самом деле произошло.
MichaelS 28.12.2015 07:22:32
@MichaelS, вы потеряли меня из-за «1D6», дающего # между 1 и 7. Я не понимаю вашего «D». Но также в отношении 2, как работает Microsoft Random.Next (min, max), программа предоставляет 1 & 7, а метод возвращает # в диапазоне 1 & 6. Так что я думаю, что вы немного отклонились от точной точности вашего аналогия (если только вы не имели в виду какое-то другое бессмысленное поведение. Но если вы намеревались обратиться к Microsoft, я просто скажу, что ваша небольшая путаница совершенно нормальна, потому что то, что сделал MS, не имеет логического смысла (кроме того, на что указывали другие). : что это стало новой «нормой»).
Shawn Kovac 29.12.2015 13:09:49
И я просто озвучиваю немного логики, чтобы логически было лучше использовать включающие min и inc max для согласованности и отвергать начавшуюся квази-норму. Это все. :)
Shawn Kovac 29.12.2015 13:11:22
1D6 означает бросок одного шестигранного кубика - тот, который используется во многих настольных играх или настольной RPG. Числа варьируются от 1 до 6 включительно, и люди скажут «от 1 до 6», а не «от 1 до 7», и предположим, что вы знаете, что 7 не включено. Вы можете использовать аналогичные аналогии со многими другими аспектами жизни. Если я скажу, что бейсбольная лига предназначена для детей от 12 до 14 лет, я включаю и 12, и 14. И т. Д. Я не могу вспомнить практический пример исключения верхней границы диапазона за пределами математического класса.
MichaelS 4.01.2016 04:57:43
Dim rnd As Random = New Random
rnd.Next(n)
0
1.12.2014 12:03:10

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

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 сбивает с толку.

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

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

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

2
17.08.2015 08:30:08

Пример 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))
3
22.02.2016 20:38:14

Просто для справки, определение VB NET Fuction для RND и 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
0
9.10.2016 21:12:23