Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
ランダムな値を取得して遊ぶ
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
public class RandomTest : MonoBehaviour {
// サイコロの目を定義
int[] dice = new int[] {1, 2, 3, 4, 5, 6};
// サイコロの目が出た回数を記録するDictionary
Dictionary<int, int> diceDict;
Dictionary<int, float> probDict;
// 1セットあたりの試行回数
[SerializeField]
int rollNum = 10000;
// セット数
[SerializeField]
int setNum = 1000;
void Start(){
OutputDiceRollResults();
}
void OutputDiceRollResults(){
// 処理開始のメッセージ
Debug.Log("***** 乱数の偏りの確認を開始 *****");
// CSVファイルのヘッダを出力
StreamWriter sw;
FileInfo fi;
string fineName = Application.dataPath + "/Resources/Csv/dice_output.csv";
fi = new FileInfo(fineName);
sw = fi.CreateText();
sw.WriteLine(GetHeaderLineString());
for (int i = 0; i < setNum; i++){
// 辞書を初期化する
InitializeDiceDicts();
// サイコロを振る
RollDicesWithNumber(rollNum);
// それぞれの目が出た回数を確率に直す
SetProbDictFromDiceDict();
// CSVファイルに出力する
sw.WriteLine(GetOutputLineString());
}
// Streamを閉じて書き込み
sw.Flush();
sw.Close();
// 処理開始のメッセージ
Debug.Log("***** 乱数の偏りの確認を終了 *****");
}
void InitializeDiceDicts(){
// それぞれの目が出た回数を保存する辞書を初期化する
diceDict = new Dictionary<int, int>();
// それぞれの目が出た確率を保存する辞書を初期化する
probDict = new Dictionary<int, float>();
foreach (int pips in dice){
diceDict.Add(pips, 0);
probDict.Add(pips, 0f);
}
}
void RollADice(){
// 乱数の範囲指定で配列のインデックスを取得する
int index = Random.Range(0, dice.Length);
// サイコロの目を取得する
int pips = dice[index];
// 出た目を記録する
diceDict[pips]++;
}
void RollDicesWithNumber(int numberOfTimes){
// 指定された回数だけサイコロを振る
for (int i = 0; i < numberOfTimes; i++){
RollADice();
}
}
string GetHeaderLineString(){
// StringBuilderを使ってヘッダ行を出力する
System.Text.StringBuilder sb = new System.Text.StringBuilder();
// サイコロの目の数だけループ
for (int i = 0; i < dice.Length; i++){
sb.Append(dice[i]);
// 配列の最後以外はカンマをつける
if (i != dice.Length - 1){
sb.Append(",");
}
}
return sb.ToString();
}
string GetOutputLineString(){
// 辞書のアイテムごとに目が出た確率を出力する
System.Text.StringBuilder sb = new System.Text.StringBuilder();
// サイコロの目の数だけループ
for (int i = 0; i < dice.Length; i++){
int pips = dice[i];
sb.Append(probDict[pips]);
// 配列の最後以外はカンマをつける
if (i != dice.Length - 1){
sb.Append(",");
}
}
return sb.ToString();
}
void SetProbDictFromDiceDict(){
// それぞれの目が出た回数を確率に直す
for (int i = 0; i < dice.Length; i++){
int pips = dice[i];
float prob = 1.0f * diceDict[pips] / rollNum;
probDict[pips] = prob;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.