web-dev-qa-db-ja.com

Excel乱数のシードを設定する

以下のExcelでは、式は平均10と分散1の正規分布から乱数を生成します。常に乱数の修正セットを取得するように修正シードを設定する方法はありますか? Excel 2010を使用しています

=NORMINV(Rand(),10,1)
11
user2543622

スプレッドシート関数を使用して、独自の乱数ジェネレーターを実装できます。たとえば、C++ 11には、繰り返しによって取得される_minstd_Rand_と呼ばれる Lehmer乱数ジェネレータ があります

_X = X*g (mod m)
_

ここで_g = 48271_および_m = 2^31-1_

_A1_には、シード値を配置できます。 _A2_に式を入力します。

_=MOD(48271*A1,2^31-1)
_

必要に応じてコピーしてください。

_B2_に=A2/(2^31-1)と入力し、_C2_に=NORM.INV(B2,10,1)と入力し、必要に応じてコピーします。 _A1_のシード値はいつでも置き換えることができることに注意してください

_=RANDBETWEEN(0,2^31-2)
_

揮発性のランダム性をオンに戻したい場合。

次のスクリーンショットは、この方法で生成された25個のランダムな正規変数を示しています。

enter image description here

ヒストグラムからわかるように、分布はほぼ正規のように見えます。

21
John Coleman

[〜#〜] vba [〜#〜]UDF() Rnd()関数。見る:

VBAでのランダム変数の繰り返し

2
Gary's Student

私はそれが完璧な解決策であるふりをしているわけではありませんが、それは私にとってはうまくいきます。その美しさは、特定のセルに乱数を割り当てることができることです:

Public Function GetRandom(seed As Double, min As Double, max As Double) As Double
    Dim colrow As Double
    Dim range As Double

    range = max - min
    If (Application.Caller.Column() = Application.Caller.Row()) Then
        colrow = (Log(Application.Caller.Column() + 1) * Log(Application.Caller.Row() + 1)) * seed
    Else
        colrow = (Log(Application.Caller.Column() + 1) / Log(Application.Caller.Row() + 1)) * seed
    End If
    Rnd (-1)
    Randomize colrow 
    test = Rnd * range - range / 2
    GetRandom = colrow 
End Function

使用法:

=GetRandom($Z$1,1,-1)

私の例では、シード値はZ1セルにありますが、もちろん他のセルに入れることもできます。また、最小値と最大値を設定できます。

enter image description here

2
koryakinp