【ウディタVer.3】乱数の仕様確認

ウディタの乱数について自己確認も含めて
調べたものをメモ。
以前Ver2時にやったものとほぼ同様です。
仕様的には変化ないので結論も前回と同じ。

<注釈>
・ウディタ Ver3.143で確認
・乱数について深く言及した学術的なものではありません

<結論>
・普通に乱数を使う分には偏ってるようには見えなかった
・何もせずロードすると乱数シード値が変化しない
・Sys110 = 0 + 0 により乱数シード値の初期化が可能

<留意点>
フレーム経過を待たずに
乱数生成前に Sys110=0 を多用すると
シード値も乱数もおかしくなる現象が起こる。
 対処方法としては
 ・ゲーム起動時やロード時のみシードを初期化
 ・ウェイト1フレームを挟む
 ・取得する度に移動する乱数テーブル(とコモン)を用意する

<検証1>
乱数が偏ってないか確認してみた
…と言っても真の乱数かなんてものには
興味はないので感覚的に乱数かどうかという点で
0~255の乱数でドットを打つという
記事があったのでまねてやってみた。
 
参考元(外部URL):Unityの乱数が本当にランダムかどうか見てみた


①.ランダムにドットを打つ

<検証内容と結果>
X=0~255、Y=0~255 の乱数を使って
ドットを2万回ほど打ってみたが
とくにパターンっぽいものは見受けられない。
※若干、note側で画像加工されて、にじんでるかも。

②.乱数0or1でドットを打つ

<検証内容と結果>
今度はX=0 -> 255 、 Y=0 -> 255 と移動させて
255回*255回の回数ループをさせて
乱数0or1で1が出たらその座標にドットを打つテスト。
こちらもパターンは見受けられない。
若干、note側で画像加工にじんでるk(以下略
(※回数が多いので、結果1より濃く見えます)

③.セーブ&ロードでの乱数仕様

<検証内容と結果>
ウディタの仕様で、ロード時は乱数シードが変化しないことの確認
1.乱数発生前にセーブ
2.乱数100回発生させてDB格納
3.DBをCSVで出力して記録
4.ロードして2から再実行
乱数シードを初期化(リセット)しない限り
セーブ&ロードしたときの乱数結果は同じでした。

④.検証した時の画像

左図が①ランダムにドットを打つ
右図が②乱数0or1でドットを打つ

1回目、セーブ後に実施
2回目、ロード後に実施

下図は、乱数を100回生成して1回目と2回目の比較をしたもの

乱数100回をテキスト比較した結果

⑤.乱数シードのリセット

セーブ&ロードで同じ乱数を使わせたくない場合
下記コマンドにてシード値を初期化(リセット)することが可能

■変数操作: Sys110:現在の乱数のシード(種) = 0 + 0
 
これをロード直後にでも1回実行させれば
下記、比較結果のように同じ乱数が出なくなり
再現性がなくなります。
(下記テキストは比較用に、","を",\n"に置換してます)

乱数シード値リセットによる乱数100回の比較

<参考(外部URL)>
Sys110:乱数シード YADOT-WOLF システム変数[77~124]の説明


<サンプルコモン:文章>

■データのセーブ: 1
▼  
▼ XY座標がランダムで点描、2万回
▼  
■変数操作: CSelf50[現在ピクチャ番号] = 1000 + 0 
■変数操作: CSelf49[開始ピクチャ番号] = CSelf50[現在ピクチャ番号] + 0 
■ピクチャ表示:CSelf50[現在ピクチャ番号] [左上]ウィンドウ「<SQUARE>」サイズ[256,256] X:0 Y:0 / 0(0)フレーム  / パターン 1 / 透 255 / 通常  / 角 0 / 拡 100% / カラー R[200] G[200] B[200]
■変数操作: CSelf50[現在ピクチャ番号] += 1 + 0 
■回数付きループ [ 20000 ]回
 |■ピクチャ表示:CSelf50[現在ピクチャ番号] [左上]ウィンドウ「<SQUARE>」サイズ[1,1] X:乱数[0~255]  Y:乱数[0~255]  / 0(0)フレーム  / パターン 1 / 透 255 / 通常  / 角 0 / 拡 100% / カラー R[0] G[0] B[0]
 |■変数操作: CSelf50[現在ピクチャ番号] += 1 + 0 
 |■
◇ループここまで◇◇
■ピクチャエフェクト:CSelf50[現在ピクチャ番号] ~ CSelf49[開始ピクチャ番号] [描画座標シフト(最終値)] Xシフト 50 / Yシフト 100 (0)フレーム
▼  
▼ 01ランダムで点描、256×256回
▼  
■変数操作: CSelf49[開始ピクチャ番号] = CSelf50[現在ピクチャ番号] + 0 
■ピクチャ表示:CSelf50[現在ピクチャ番号] [左上]ウィンドウ「<SQUARE>」サイズ[256,256] X:0 Y:0 / 0(0)フレーム  / パターン 1 / 透 255 / 通常  / 角 0 / 拡 100% / カラー R[200] G[200] B[200]
■変数操作: CSelf50[現在ピクチャ番号] += 1 + 0 
■変数操作: CSelf53[X座標] = 0 + 0 
■回数付きループ [ 256 ]回
 |■変数操作: CSelf54[Y座標] = 0 + 0 
 |■回数付きループ [ 256 ]回
 | |■変数操作: CSelf14[一時乱数] = 0 ~ 1 
 | |■条件分岐(変数):  【1】 CSelf14[一時乱数]  が   1 と同じ  【2】 CSelf14[一時乱数]  が   0 と同じ 
 | |-◇分岐: 【1】  [ CSelf14[一時乱数]  が  1 と同じ  ]の場合↓
 | | |■ピクチャ表示:CSelf50[現在ピクチャ番号] [左上]ウィンドウ「<SQUARE>」サイズ[1,1] X:CSelf53[X座標] Y:CSelf54[Y座標] / 0(0)フレーム  / パターン 1 / 透 255 / 通常  / 角 0 / 拡 100% / カラー R[0] G[0] B[0]
 | | |■変数操作: CSelf50[現在ピクチャ番号] += 1 + 0 
 | | |■変数操作: CSelf11[一時変数B] += 1 + 0 
 | | |■
 | |-◇分岐: 【2】  [ CSelf14[一時乱数]  が  0 と同じ  ]の場合↓
 | | |■変数操作: CSelf10[一時変数A] += 1 + 0 
 | | |■
 | |◇分岐終了◇
 | |■変数操作: CSelf54[Y座標] += 1 + 0 
 | |■
 |◇ループここまで◇◇
 |■変数操作: CSelf53[X座標] += 1 + 0 
 |■
◇ループここまで◇◇
■ピクチャ表示:CSelf50[現在ピクチャ番号] [左上]文字列[0の回数:\cself[10]\n] X:0 Y:260 / 0(0)フレーム  / パターン 1 / 透 255 / 通常  / 角 0 / 拡 100% / カラー R[200] G[200] B[200]
■変数操作: CSelf50[現在ピクチャ番号] += 1 + 0 
■ピクチャエフェクト:CSelf50[現在ピクチャ番号] ~ CSelf49[開始ピクチャ番号] [描画座標シフト(最終値)] Xシフト 350 / Yシフト 100 (0)フレーム
▼  
■変数操作: CSelf12[一時変数C] = 0 + 0 
■回数付きループ [ 100 ]回
 |■変数操作: CSelf14[一時乱数] = 0 ~ 255 
 |■可変DB書込:DB[ 乱数格納テーブル : 共通 : CSelf12[一時変数C] ]  (0 : 0 : -) =  CSelf14[一時乱数]
 |■変数操作: CSelf12[一時変数C] += 1 + 0 
 |■
◇ループここまで◇◇
▼  
■文字列操作:CSelf5[一時文字列] = "_Date\sys[80]\sys[81]\sys[82]"
■DBからCSVファイルに保存:  可変DB[乱数格納テーブル:共通](乱数格納テーブル : 共通) から [ 1 ]データ  →  ファイル "Data/db\cself[5].csv"
▼  
■キー入力:CSelf0[キー入力待ち][入力待ち]  決定(10)
■変数操作: CSelf4[コモン自滅フラグ] = 1 + 0

<イベントコード>
※Cself4はコモンイベントを並列(条件)で動かしたときに使用

WoditorEvCOMMAND_START
[220][2,0]<0>(0,1)()
[103][0,1]<0>()(" ")
[103][0,1]<0>()("XY座標がランダムで点描、2万回")
[103][0,1]<0>()(" ")
[121][4,0]<0>(1600050,1000,0,0)()
[121][4,0]<0>(1600049,1600050,0,0)()
[150][18,1]<0>(48,1600050,0,256,256,1,255,0,0,100,0,0,33554432,0,0,200,200,200)("<SQUARE>")
[121][4,0]<0>(1600050,1,0,256)()
[179][1,0]<0>(20000)()
[150][18,1]<1>(48,1600050,0,1,1,1,255,8000255,8000255,100,0,0,33554432,0,0,0,0,0)("<SQUARE>")
[121][4,0]<1>(1600050,1,0,256)()
[0][0,0]<1>()()
[498][0,0]<0>()()
[290][7,0]<0>(32,0,1600050,1600049,50,100,0)()
[103][0,1]<0>()(" ")
[103][0,1]<0>()("01ランダムで点描、256×256回")
[103][0,1]<0>()(" ")
[121][4,0]<0>(1600049,1600050,0,0)()
[150][18,1]<0>(48,1600050,0,256,256,1,255,0,0,100,0,0,33554432,0,0,200,200,200)("<SQUARE>")
[121][4,0]<0>(1600050,1,0,256)()
[121][4,0]<0>(1600053,0,0,0)()
[179][1,0]<0>(256)()
[121][4,0]<1>(1600054,0,0,0)()
[179][1,0]<1>(256)()
[121][4,0]<2>(1600014,0,1,24576)()
[111][7,0]<2>(2,1600014,1,2,1600014,0,2)()
[401][1,0]<2>(1)()
[150][18,1]<3>(48,1600050,0,1,1,1,255,1600053,1600054,100,0,0,33554432,0,0,0,0,0)("<SQUARE>")
[121][4,0]<3>(1600050,1,0,256)()
[121][4,0]<3>(1600011,1,0,256)()
[0][0,0]<3>()()
[401][1,0]<2>(2)()
[121][4,0]<3>(1600010,1,0,256)()
[0][0,0]<3>()()
[499][0,0]<2>()()
[121][4,0]<2>(1600054,1,0,256)()
[0][0,0]<2>()()
[498][0,0]<1>()()
[121][4,0]<1>(1600053,1,0,256)()
[0][0,0]<1>()()
[498][0,0]<0>()()
[150][18,1]<0>(32,1600050,0,1,1,1,255,0,260,100,0,0,33554432,0,0,200,200,200)("0の回数:\cself[10]<\n>1の回数:\cself[11]")
[121][4,0]<0>(1600050,1,0,256)()
[290][7,0]<0>(32,0,1600050,1600049,350,100,0)()
[103][0,1]<0>()(" ")
[121][4,0]<0>(1600012,0,0,0)()
[179][1,0]<0>(100)()
[121][4,0]<1>(1600014,0,255,24576)()
[250][5,4]<1>(0,0,1600012,196608,1600014)("","乱数格納テーブル","共通","")
[121][4,0]<1>(1600012,1,0,256)()
[0][0,0]<1>()()
[498][0,0]<0>()()
[103][0,1]<0>()(" ")
[122][3,1]<0>(1600005,0,0)("_Date\sys[80]\sys[81]\sys[82]")
[251][5,4]<0>(0,0,0,200704,1)("Data/db\cself[5].csv","乱数格納テーブル","共通","")
[103][0,1]<0>()(" ")
[123][2,0]<0>(1600000,144)()
[121][4,0]<0>(1600004,1,0,0)()
WoditorEvCOMMAND_END

<ロードしたい場合>
Ver3の途中から並列処理からのロード不可になってるので
なんらかのイベントを設置して決定キーで起動するなどして
ロードしてくだしあ。

この記事が気に入ったらサポートをしてみませんか?