VB.NETのランダムな整数


50

単体テストに使用するには、1からn(nは正の整数)の間のランダムな整数を生成する必要があります。真のランダム性を保証するために、あまりに複雑な何かを必要としません。これは昔ながらの乱数です。

どうすればいいですか?

49

1からNまでの任意の整数値を取得するには、以下を使用します。

CInt(Math.Ceiling(Rnd() * n)) + 1 
+6

*「1とN(両端を含む)」間違っていると、「0」と「N」の間の値を返します。 'Math.Ceiling(0)'は '0'です。 18 7月. 122012-07-18 21:09:58

+5

Rnd()は0を返すことができます。これが起こると、n> 0の場合でも結果は0になります。これは非常に厄介なバグです。バグのあるコードが必要な場合は、これを使用してください。 MSのドキュメントを読む: "Rnd関数は1より小さいがゼロ以上の値を返します。" http://msdn.microsoft.com/en-us/library/f7s023d2(v=vs.90).aspx 30 1月. 142014-01-30 15:10:17

+4

これをそのまま試して、n = 11を使用すると12のインスタンスが実行されました。包括的ではありません。 MSDNにはより良い例があります:randomValue = CInt(Math.Floor(upperbound - lowerbound + 1)* Rnd()))+ lowerbound 19 12月. 142014-12-19 18:27:57


4
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 
+2

バグが必要な場合は、このコードを使用してください。 MSはNext()メソッドをかなり奇妙にしました。 Minパラメータは予想通りの最小値ですが、Maxパラメータは期待しないような排他的な最大値です。言い換えれば、min = 1とmax = 5を渡すと乱数は1,2,3,4のいずれかになりますが、5は決して含まれません。 30 1月. 142014-01-30 16:31:00

+4

@ShawnKovacこれはほとんどの乱数生成器の実装方法です。 30 1月. 142014-01-30 17:53:28


32

使用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) 
+5

返り値New Random()。次の(minValue、maxValue) 02 2月. 102010-02-02 10:25:35

+2

Trueでよりシンプルに見えます。しかし、ユーザが(1つではなく)乱数列を必要とする場合は、乱数参照を保持したいと考えています。 03 2月. 102010-02-03 00:01:01

+1

'Dim Generator'を' Static Generator'に変更し、あなたが保持できるインスタンスを持っています(スレッドセーフなインスタンスではありませんが、ほとんどの現実的なシナリオでは問題になりません)。 20 4月. 102010-04-20 18:50:54

+1

よりシンプルに見えますが、このコードは間違っています。バグが必要な場合は、このコードを使用してください。 MSはNext()メソッドをかなり奇妙にしました。 Minパラメータは予想通りの最小値を含みますが、Maxパラメータは期待しない*排他的最小値です。言い換えると、min = 1とmax = 5を渡すと、乱数は1,2,3,4のいずれかになりますが、5は含まれません。 30 1月. 142014-01-30 15:15:01

  0

@ShawnKovac - 良いキャッチ。私はRandom.Nextの最小値と最大値の間に包括的な\排他的な不一致があることに気付かなかった。コードサンプルが更新されました。 01 2月. 142014-02-01 19:27:29


61

次のようなコードを書くための提案は問題がある、何度も指摘されているとおり:

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 ms付近のどこか)。次のコードを記述するのであれば、あなたは行に同じ数を何回の束を取得するつもりだ:

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 

は、私が一緒に投げたが1〜100の間で25個のランダムな整数を生成するために、両方の方法を使用して簡単なプログラムは、ここで出力です:

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 
  0

これは実際には "100"を生成することはないと思います。それは実際には最小値と最小値の間です(私は思います) 11 4月. 122012-04-11 13:29:47

+1

@maxhodges:そうです、あなたは正しいと思います。間にはあいまいな曖昧さがあります。私はOPが100が含まれているかどうかを気にするかどうかわかりません。私は個人的にはしませんでした。私の答えは 'Static'キーワードを使って複数の関数呼び出しの中で' Random'オブジェクトを共有することを説明することを意図していました。 11 4月. 122012-04-11 13:56:03

  0

私はこのコードを複数回参照する必要があることを知りました。ありがとうございました! 30 6月. 132013-06-30 17:53:33

  0

私はStaticの洞察に+1しますが、コードはバグです。その静的な洞察力のための名誉!私はバグの答えをあなたに-1回与えます。しかし、それらは均等になります。 30 1月. 142014-01-30 15:24:08

+3

バグが必要な場合は、このコードを使用してください。 MSはNext()メソッドをかなり奇妙にしました。 Minパラメータは予想通りの最小値ですが、Maxパラメータは期待しない最小値です。つまり、min = 1とmax = 5を渡すと、乱数は1,2,3,4のいずれかになりますが、5は決して含まれません。 30 1月. 142014-01-30 15:24:52

+1

@ShawnKovac:驚くことでしょう。しかし、それを「バギー」と呼ぶのは、私の意見では少し残忍です。あなたが期待していた振る舞いではありませんでした。真実は、(私が知っている)ほとんどの乱数の実装が以下のように動作することです:包括的な下限、排他的な上限。配列からランダムな項目を選択する( '0'と' array.length'の間で項目を選択するなど)、多くの一般的な使用例で便利です。 30 1月. 142014-01-30 15:37:26

  0

Javaの場合、['Random.nextInt'](http://docs.oracle.com/javase/7/docs/api/java/util/Random.html#nextInt(int))、[' Math。ランダム '](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random)JavaScriptで、[' rand'](http://www.ruby-doc .org/core-2.1.0/Random.html#method-i-rand)。 30 1月. 142014-01-30 15:39:11

  0

ありがとうございました。私はそのフィードバックを感謝します。それはせいぜい厄介で、「最小」と「最大」を考えているプログラマーは包括的で排他的なものとして一貫性のある類似性を持っています。しかし、これは人間です。プログラミングにおける多くの「欠点」は、なぜプログラミングがそれほど難しいのかということです。よりよいコードを書くだけです。私はあなたのフィードバックをいただきありがとうございます。ありがとう。 30 1月. 142014-01-30 16:37:05

  0

私はバグでも奇妙でもないものを信じていますが、品質のコードでさえ、変数が明示的に*明示されていれば、incMinとexcMaxは実現可能な短い名前になります。 :)とincMin = inclusive minimum&excMax = exclusive maximumというコメントかもしれません。 30 1月. 142014-01-30 16:37:53

  0

@dantao:あなたのフィードバックに感謝します。私の心をもう少し開いてくれてありがとう(少なくとも私はそれを別の方法で見ることができるほど)。 ;)私は自分の変数を「固定コード」に指定していますので、後で自分のコードを見ることができる他のプログラマーが、この「風変わりな」動作を期待すれば混乱することはありません(私にとっては、両方のパラメータの一貫性のある使用は包括的でも排他的でもない)。私のメソッドは両方のパラメータに包括的な限界を使用します。これにより結果としてintの最大、全範囲が許されます。これはどのようにコード化されるべきかを感じる方法です。 30 1月. 142014-01-30 16:47:38

  0

@ShawnKovac:あなたは一人ではありません。例えば、Pythonの['random.randint'](http://docs.python.org/2/library/random.html#random.randint)は両端に含まれています。変数名 'min'と' max'はおそらくより明示的でなければならないことに同意します(実際に2012年4月の私の以前のコメントであいまいさが言及されています)。インターフェイスを設計する際には、複雑な質問をしているように思います。直感的な「真空」にするか、前に来たものから開発者の期待を引きますか? 30 1月. 142014-01-30 16:52:11

  0

@ShawnKovac:0ベースの配列インデックス作成は、完全な例です。間違いなく "直感的"ではありませんが(少なくとも最初はいくつかありますが)、1ベースのインデックスを使用する新しい言語を作成すると、実際には多くの開発者を驚かせるでしょう。したがって直感的でないことは、以前の経験に基づいて直観的になることができます。 .NETの 'Random.Next'での私の気持ちは、それが灰色の領域のどこかにあるということです。デベロッパーの多く(あなたのような)は確かにそれが驚くべきものだと思っていますが、私はそれが持っている振る舞いを正確に期待している人もかなりいると思います。 30 1月. 142014-01-30 16:54:48

  0

はい、私は逆の使用にケータリングを理解しています。それは非常に一般的な '期待された' Cスタイルの宣言のため、配列の宣言が直感的ではない場合、VBの最大インデックスについて考えるのは面白いです。しかし、あなたが正しいです、より大きな画像は全体のインデックス作成の問題です。あなたはとても正しいです。今私たちはそれに慣れており、1ベースのインデックス作成を使うのはもっと厄介です...今はそれに慣れています。私はあなたのポイントを正確に信じています。それらのポイントとあなたの知恵を共有してくれてありがとう! VBのInstr()メソッドも1ベースのインデックス作成の良い例です。まあ、確かに一つのことは時間とともに変化すると思います。 :) 30 1月. 142014-01-30 17:01:53

  0

私は次のように関数を変更しました: ジェネレータを静的にすることで、公共関数GetRandom(ByVal Min As Integer、ByVal Max As Integer)としてInteger 'を使用して、同じインスタンス' 'を保存します同じシードの同じインスタンスを持つインスタンス) ' として静的ジェネレータSystem.Random =新しいSystem.Random() 整数としてのDim結果=ジェネレータ。次の(最小値、最大値) 結果=最大値の場合 - 結果1 終了機能 私が望む最大値よりも1を超えています(たとえば、最大値255が必要な場合は最大値として256を渡します)。 24 11月. 162016-11-24 17:40:16


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

+3

これは恐ろしいです。それはまったくランダムではありません。それは時間に基づいて唯一の事前計算された数です。これは乱数のいかなる特性も示さないであろう。プラスそれは質問に答えることはありません。疑問は、乱数を生成する方法ではなく、1と与えられた値の間の乱数を生成することであった。 30 1月. 142014-01-30 15:33:20


1

あなたは偉大な答えであるヨセフの答えを使用している場合は、あなたがこれらのバックは次のようにバックアップするために実行します。

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

その後その結果、コールがすぐに処理されるため、同じ結果が何度も繰り返される可能性があります。これは'08年の問題ではなかったかもしれませんが、今日のプロセッサの方がはるかに高速であるため、システムクロックで2回目の呼び出しを行う前に十分な時間を変更することはできません。

System.Random()関数はシステムクロックに基づいているため、次の呼び出しの前に変更するのに十分な時間が必要です。これを達成する1つの方法は、現在のスレッドを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 
+2

バグが必要な場合は、このコードを使用してください。 MSはNext()メソッドをかなり奇妙にしました。 Minパラメータは予想通りの最小値ですが、Maxパラメータは期待しない最小値です。つまり、min = 1とmax = 5を渡すと、乱数は1,2,3,4のいずれかになりますが、5は決して含まれません。 30 1月. 142014-01-30 15:26:35

  0

@ShawnKovac次のことについて教えていただきありがとうございます。関数はMaxの番号と静的なsystem.randomオブジェクトの使用を返さない(ただしMinとMaxの名前は今やちょうどA:Bなので、もはや適切ではないかもしれない)。私はテストを行い、2人のパフォーマンスは同等です。また、int32の代わりに整数を使用しています(現在はint32にバインドされているため、ほとんど同じです).SQLで多くの作業を行っているので、構文が気に入っていて、タブ。' (自分自身にもかかわらず)〜乾杯 21 3月. 142014-03-21 19:16:04

  0

あなたのコードを修正するための世話をしてくれてありがとう。あなたはその中の他の多くの人々をはるかに超えています。はい、Int32とIntegerは、私が知る限り、まったく同じ効果をもたらします。私を除いて、「Ingeger」というIntegerのサイズがわからない人にとって、Int32はより明確です。それが私がInt32を使う最大の理由です。しかし、私はそれが完全に好みのものだと理解しています。 27 3月. 142014-03-27 16:06:56

  0

また、短いInt32エイリアスが好きです。また、インテリジェンスでは、タイピングはほぼ同等です。しかし、私はよりコンパクトな読書も好きです。しかし、C#をコーディングするとき、初心者が自分のコードを見ている場合に、他の人々の明快さのために、より短い「int」よりむしろ、より具体的なInt32を使用したいと思っています。しかし、彼自身のそれぞれに。 :) 27 3月. 142014-03-27 16:08:35

  0

私はあなたのコードがバグアウトか、max = Integer.MaxValueの場合はエラーをスローすることを指摘したいだけです。もちろん、これは通常問題ではありませんが、もしあなたがその潜在的な問題を排除したいのであれば、Integer.MaxValueをインクルードしたい場合は、ランダムなIntの全範囲を与えるためのソリューションを提供しました。残念ながら、マイクロソフトでは、非常に奇妙なランダム関数と呼ばれるものを実装したときに、このための非常に堅牢なコードを簡単に作成することはできませんでした。本当に堅牢なコードは来るのが難しいです。 : 27 3月. 142014-03-27 16:11:52


5

をすべての答えは、これまでの問題やバグを持っている(複数、1つだけでなく)。私は説明します。しかし、まず、ダン・タオの洞察に静的変数を使ってジェネレータ変数を覚えておきたいので、何度も同じことを何度も繰り返さないようにしてください。しかし、彼のコードは、私が今説明しているように、ほとんどの人が持っているのと同じ欠陥がありました。

MSはNext()メソッドをかなり奇妙にしました。 Minパラメータは予想通りの最小値ですが、最大パラメータはで、の排他的ではありません。言い換えると、min = 1とmax = 5を渡すと、乱数は1,2,3、または4のいずれかになりますが、5は含まれません。これは、MicrosoftのRandom.Next()メソッドを使用するすべてのコードの2つの潜在的なバグのうちの最初のものです。 シンプル答え(まだ他の可能性のあるまれな問題で)、あなたが使用する必要があるだろうについては

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 

それはそれがより明確になりますので、(私はむしろIntegerよりInt32を使用したいですどのように大きなintがあり、それに加えて入力しますが、自分に合うように短くなっています。)

私はこの方法では2つの潜在的な問題を参照してください、それはほとんどの用途のために)適した(と正しくなります。だからの簡易ソリューションが必要な場合は、これが正しいと思います。

この関数で表示される唯一の2つの問題は次のとおりです。 1:Max = Int32.MaxValueの場合、1を追加すると数値オーバーフローが発生します。 altho、これはまれで、まだ可能性があります。 2:min> max + 1. min = 10かつmax = 5のとき、Next関数はエラーをスローします。これはあなたが望むものかもしれません。それはどちらでもないかもしれません。または、min = 5とmax = 4.を考慮して、1を追加すると5がNextメソッドに渡されますが、実際にエラーが発生してもエラーは発生しませんが、テストしたMicrosoft .NETコードは5です。 max = minのときは、実際には「排他的な」maxではありません。しかし、Random.Next()関数のmax <分のときは、ArgumentOutOfRangeExceptionがスローされます。 Microsoftの実装は実際には一貫性がなく、この点でもバグです。

あなたは分が> maxはありませんので、エラーがスローされていない場合、単純に数字を交換することもできますが、それは完全に希望されているものに依存します。無効な値でエラーを発生させたい場合は、このコードでMSの排他的な最大値(max + 1)が最小値になったときにエラーをスローする方が良いでしょう。回避策最大= Int32.MaxValueを少し不便ですが、私はこのような状況の両方を処理する徹底した機能を掲示することを期待するときのための取り扱い

。私がそれをコード化したものとは異なる振る舞いをしたいのなら、あなた自身に合ってください。これらの2つの問題に注意してください。

ハッピーコーディング!

編集: だから私は、ランダムな整数ジェネレータを必要とし、私はそれを「正しい」をコーディングすることを決めました。だから誰もが完全な機能を望むなら、ここで実際に動作するものがあります。 (。。しかし、それは、コードのわずか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 
+1

Billは言ったように、 'Next()'の振る舞いは完全に正常であり、むしろ「奇妙」ではありません。 17 9月. 152015-09-17 14:39:59

  0

さまざまなプログラミング言語の組み込み関数それは実際には世界の他の人にとってはむしろ奇妙なことです。あなたが最後に誰かが1D6で1から7までの数字を与えると聞いたのですか?注意深くその言語の文書を読んでおらず、 28 12月. 152015-12-28 07:22:32

  0

@MichaelS、あなたは1D6で私を失ってしまったが、1と7の間に#を付けてしまった。私はあなたのDを理解していない。しかし、RNG関数の奇妙な振る舞いは、驚くべきことであり、また、マイクロソフトのRandom.Next(最小、最大)がどのように動作するかについては、プログラムは1と7を提供し、メソッドは1と6の範囲で#を返します。だから私はあなたのアナロジーの正確さ(あなたが何か他の無意味な行為を指していない限り。しかし、もしあなたがマイクロソフトを参照しようとしていたら、ちょっとしたミックスアップは完全に*ノーマル*だと言うのは、MSが行ったことは論理的な意味を持たないからです(他の人が指摘したこと以外は新しい標準です)。 29 12月. 152015-12-29 13:09:49

  0

そして私は、一貫性のために包括的な最小値と包括的な最大値を使用し、始まった疑似的な「ノーム」を拒否することが論理的には論理的であるという少しの論理を単純に発声しています。それで全部です。 :) 29 12月. 152015-12-29 13:11:22

  0

1D6は、多くのボードゲームや卓上RPGで使用されている種類の片面6面ダイを意味します。数字の範囲は1から6までで、人々は「1から7」ではなく「1から6」と言い、7が含まれていないことを知っていると仮定します。あなたは人生の他の多くの側面から同様の類推を使用することができます。私が12歳から14歳の子供のための野球リーグだと言うと、私は12歳と14歳の両方を含めています。数学クラス外の範囲の上限を除外する具体的な例は考えられません。 04 1月. 162016-01-04 04:57:43

  0

さて、@MichaelS、私はあなたの投稿を理解するようになりました。私はあなたと私が完全に同意するのを見ます。あなたはちょうど別の方法で同じ概念を表現しました。いい点。:)説明をありがとう。 11 1月. 162016-01-11 17:55:29


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

1

あなたは一度だけ、擬似乱数ジェネレータを作成する必要があります。

整数は、あなたのニーズに十分応えている場合
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に、乱数の有効なシーケンスが得られるとは確信していません。むしろ、コンピュータ時間に基づいて自動的にシードされる複数の異なるシーケンスの最初の数のコレクションを取得します。これらの数字がシーケンスのランダム性を確認するテストに合格することは確かではありません。


1

マイクロソフト例Rnd Function

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

の1-乱数ジェネレータを初期化します。

Randomize() 

2 - ランダムな値を生成する

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

0
参考まで

、BASICの同じ結果(1980年を与えるべきであるRNDとRANDOMIZE(のためのVB NETのfuctionの定義)と1の間と6すべてのバージョンの後です:

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 

ランダム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