質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

922閲覧

[Unity]ウェブサイトで紹介されいるコードを真似て確率計算のコードを書きたいのですが、一部書き方がわからない所があります

kosho206

総合スコア41

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/06/21 08:38

https://kan-kikuchi.hatenablog.com/entry/ProbabilityCalclator
↑こちらのサイトを参考にして、確率計算のコードを書こうとしています。
このサイトでは、真偽を確率で判定するコードと、複数の中から確率で1つを抽出するコードを紹介していますが、今回僕は後者の方を真似ようとしています。

こちらのサイトでは

/// <summary> /// 入力したDictから一つを決定し、そのDictのkeyを返す /// </summary> public static T DetermineFromDict<T>(Dictionary<T, int> targetDict){ Dictionary<T, float> targetFloatDict = new Dictionary<T, float>(); foreach (KeyValuePair<T, int> pair in targetDict) { targetFloatDict.Add(pair.Key, (float)pair.Value); } return DetermineFromDict (targetFloatDict); } /// <summary> /// 確率とその対象をまとめたDictを入力しその中から一つを決定、対象を返す /// </summary> public static T DetermineFromDict<T>(Dictionary<T, float> targetDict){ //累計確率 float totalPer = 0; foreach (float per in targetDict.Values) { totalPer += per; } //0〜累計確率の間で乱数を作成 float rand = Random.Range (0, totalPer); //乱数から各確率を引いていき、0未満になったら終了 foreach (KeyValuePair<T, float> pair in targetDict) { rand -= pair.Value; if(rand <= 0){ return pair.Key; } } //エラー、ここに来た時はプログラムが間違っている Debug.LogError ("抽選ができませんでした"); return new L

と書くことで確率計算の処理をして、その後に

//複数の中から確率で一つを選択 //ProbabilityCalclator.DetermineFromDict //Dictionary<対象, 確率>でDictを作成し、入力する。確率はint or float Dictionary<Color, int> colorPerDict = new Dictionary<Color, int> () { {Color.red, 25}, {Color.green, 15}, {Color.blue, 60} }; //RGBから一色選ぶ、確率はそれぞれ25%,15%,60% Color color = ProbabilityCalclator.DetermineFromDict<Color> (colorPerDict);

と書くことで、実際に複数あるもの中から指定した確率で1つを抽出できると書いてあります。
今回僕は、int型の変数を確率で決めるようにしたいです。

具体的にはint型の変数を、

93%の確率で
Hoge = 1
7%の確率で
Hoge = 2

となるようにしたいです。

このサイトの例では、Colorを確率で決めるコードが書かれていますが、Colorではなくint型の変数を確率で決めたい場合、どういう書き方をすればできるのかわかりません。
int型の変数を確率で決めるコードの例を、どなたか教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YT0014

2020/06/21 10:09

ジェネリックと<T>の意味を調べて、理解してください。
guest

回答2

0

ベストアンサー

Dictionaryと呼び出し箇所を下記の様に書き換えて下さい。

C#

1 Dictionary<int, int> perDict= new Dictionary<int, int>() 2 { 3 {1, 93}, {2, 7} 4 }; 5 6  int Hoge = ProbabilityCalclator.DetermineFromDict<int>( perDict );

以上です。

以下テストコード========================================

実際に確率通りになっているのか疑問に思うかもしれないのでテストコードも書いておきます。

ProbabilityCalclatorクラスの存在するプロジェクト内でこのクラスを作成
シーン内の何かにアタッチして下さい。

C#

1using System.Collections.Generic; 2using UnityEngine; 3 4public class PercentTest : MonoBehaviour 5{ 6 Dictionary<int, int> perDict = new Dictionary<int, int>() 7 { 8 {1, 93}, {2, 7} 9 }; 10 11 void Start() 12 { 13 int i = 0; 14 while( i < 10000 ) 15 { 16 int Hoge = ProbabilityCalclator.DetermineFromDict<int>( perDict ); 17 Debug.Log( Hoge ); 18 i++; 19 } 20 } 21}

ゲーム再生後ConsoleタブでCollapseをオンにすれば呼び出し回数が判ります。
1万も試行すれば近似はすると思います。

イメージ説明

投稿2020/06/24 03:00

編集2020/06/26 06:56
Hawn

総合スコア1222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kosho206

2020/06/25 09:20

ありがとうございます 教えて頂いたコードを使ったところ、無事int型の変数を確率で変更できるようになりました。
guest

0

93%の確率で
Hoge = 1
7%の確率で
Hoge = 2

困り事が何なのかがわかりません.

例えば「(6面)サイコロを振って,出た目が1か2ならばXXX,それ以外はYYY」とかいう話があったとき,
XXXの確率は2/6(=1/3), YYYの確率は4/6(=2/3) という話はわかりますよね?

それと同じようなことをすれば良いだけでしょう.

100面サイコロ
:何か適当に100通りの値を(相応に"均等"と見なせる確率で)出力できる手段(疑似乱数で良いかと)
を用意し,
その出力値に応じて「Hogeの値を1か2のどちらにするのか」を決めれば良いのではないでしょうか.

投稿2020/06/22 01:20

fana

総合スコア11656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問