Google ChromeでSnap!のサイトを開くと以下の不具合が起きます
・Webclassに掲載したSNAP!のプログラムファイルがダウンロードできない
・Snap!でプログラムに名前を付けて保存してもiPadに保存されずダウンロードもできない
対処法:
ブラウザは Safari を使用して課題を進める
ゲームでダイスを振った結果やカードをシャッフルして配ることを表現するには偶然を扱う必要がある。
ゲームのキャラクターの行動を不規則で予測のつかない状態にしたりステージのアイテムや障害物の出現位置をデタラメにするためにも偶然を扱うことになる。
ゲームのマップで3Dの地形や草木をプログラムで自動生成する際にも偶然を用いる。
「好きな数字を自由に1つ選んで」の回答も偶然の結果として考える。
偶然のことをランダム(Random)と呼ぶ。
プログラムではランダム関数で予め決まった範囲から数値を「ランダムに選んだものとして」1つ求めることができる。
ランダムではない関数では引数の値を処理した結果が得られる。引数の値が同じなら必ず同じ結果が求まる。
ランダム関数の引数と結果:
求めるランダムな数値の発生範囲を引数で指定する
求まる数値は毎回ランダムで異なる
引数でシード値を与えることができる。シード値を設定することで同じシード値からは必ず決まった順序でランダムな値を発生させることができる。
ランダム関数には周期性がある。ランダムな値を繰り返し求めているうちに必ず元の発生パターンに戻る。つまり完全にはランダムではない。
ランダム関数の値は疑似乱数とよばれる数列の値を順番に計算して求めている。シード値はこの乱数列の初期値となる。
ゲームで使用する疑似乱数の数列の漸化式と初期値を知ることが出来たら、ゲームで発生するランダムなイベントの結果を予め計算して調べておくことができるようになる。
参照: 疑似乱数
計算方法は単純だが周期が短く乱数の性質(偏りや規則性が現れる)も悪い。初期のゲームプログラムで用いられていた。現代でも乱数の性質の悪さをゲーム要素として利用したい場合には採用してもよいだろう。
シミュレーションによる実験に用いられる高性能な疑似乱数。周期は長く実用の範囲で気にする必要はない。偏りや規則性が現れにくい。
計算コストが他の方法に比べて高くなるのでゲーム用の疑似乱数としては過剰な性能。
マインクラフトのワールド生成などで使用されている模様※。
※数学セミナー2022.07 p.62
単純な計算方法のわりに良い性質をもつ。ゲーム向き。
Unityのランダム関数で利用されている。https://docs.unity3d.com/ja/2021.2/ScriptReference/Random.html
疑似乱数のランダム関数から得られる値は決められた範囲のなかでどのランダム値も同じ確率で得られることが望ましい。
これを乱数が一様に分布、一様乱数などという。
離散的な一様乱数
1,2,3,4,5,6,7,8,9,10 の範囲で一様に整数値を出力するランダム関数では、どの数値も1/10の確率で出力されているとみなせる。
連続的な一様乱数
0.0から1.0の範囲で一様にfloat値を出力するランダム関数は
乱数値 R ≦ 閾値 X
のとき X=1/2 でRは1/2の確率でX以下になる。X=0.1なら1/10、X=0.9なら9/10の確率に対応する。
Rは厳密には整数値で生成したR’をR’/最大値でfloat のRに変換したものなので離散的に分布している。
2021年度の動画です。Webclassの部分は古い内容です。
チャプターが設定してあるので参考にしてください。
線形合同法でランダム関数を作る
スプライト名 「Sprite」 のスクリプトを以下を参考に組み立て動作を確認する。
実験 シード値aが0と2の2つの乱数系列が生成される
0 1 8 9 4 5
2 3 10 11 6 7
剰余計算を12から13に変更すると
0 1 8 5 10 6 4 3 9 12 7 11
2
の2系列になる。
周期が最大化する条件について(a=12, B=1, M=24 を試すとよい)
ブロックエディタ―は「Random_Generator」ブロックを右クリック→編集 で開く。
ランダム関数から指定した範囲の乱数を作る
Stageのスクリプトを以下を参考に組み立て動作を確認する。
実験 疑似乱数の生成範囲を変更して性能を確認する。
奇数と偶数が交互に生成される。生成範囲を1から2に制限すると1と2を交互に繰り返す。
双六を作る
以下は一直線の双六のマス目を配置するコード。マス目は水色と赤色がある。赤色がアウトのマスで止まるとスタートに戻される。
カードを1枚ずつシャッフルする
以下の例ではSnap!の標準のランダム関数を使用している。代わりに前掲のスクリプトの様に「myRand」を利用してもよい。
カード全体をシャッフルする
ここでSnap!のコードを一旦保存しておくとよい。
ファイルアイコン → プロジェクトを書きだす
第1回課題「リストでゲームの道具あるいは状況を表現する」で表現した題材に対して、ランダムを利用する。
題材は第1回課題の各自の回答から発展させてもよいし、新規に題材を選び直してもよい。
スクリプトの作成は、Snap!で新規スプライトを作成してスクリプトを組み込む(以下に掲載の画像参照)。
例)双六の出目の記録 / ボードにランダムプレイ / キャラクター作成
上で示したスクリプトを含むSnap!のファイルをWebclassのGPx01に添付しておいた。
ファイル名 random_2.xml
注意 このファイルには課題1と2の内容は含まれない。課題1~3は1つのファイルに全て記録して提出する。課題1と2を保存せずにこのファイルを開くと課題1と課題2で取り組んだ作業は消える。
コードの改良について
今回の実験で用いた線形合同法による疑似乱数列は下位のビットに強い規則性が現れる。例えば、最下位のビットは0と1を交互に繰り返すので偶数と奇数が交互に現れる(先回の実験結果参照)。
そこで、疑似乱数列を上位15ビットと下位16ビットに分けて上位ビットと下位ビットを入れ替えてから6で割った余りに変換するようにコードを修正した結果を以下に示しておく。
奇数と偶数が交互に現れるようなことは無くなり、6x6の36マスからランダムに3600回選んだ結果についても各マス目は平均値の100回前後にバラついて選択されている。
上記のコードをWebclassの資料GPx01に random_3.xmlで添付しておく。
SNAP!のファイルアイコンから プロジェクトを書き出す でコンピューターに保存する。
ブラウザのダウンロード領域に保存されたファイルをWebclassにアップロードする。