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

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

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

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

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

Q&A

2回答

5011閲覧

C# 乱数で生成する数字の出現頻度

Yoshikun_0945

総合スコア224

C#

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

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

0グッド

0クリップ

投稿2017/02/02 06:34

#実現したいこと
C#の乱数宣言(0~7)を行いましたが、特定の数字だけめったに生成されないように頻度の調整を行いたいです。
頻度調整の対象になる数字1~3です。
各数字ごとに調整を行いたいです。

###方法など
1つの乱数で実装することは可能ですか?
1つの乱数で実装出来ないなら、複数の乱数を組み合わせて実装したいと考えています。

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

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

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

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

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

guest

回答2

0

特定の数字だけ登場頻度の少ないリストを作って、
そこから値を取り出すためのインデックスを乱数で生成する、とかですかね。

csharp

1// 1,2,3だけ登場頻度の少ないリスト 2List<int> source = new List<int>() {0, 0, 0, 1, 2, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7}; 3 4Random random = new Random(); 5int randomIndex; 6int randomValue; 7 8// 確認 9for ( int i = 0; i < 100; i++ ) 10{ 11 randomIndex = random.Next(source.Count); 12 randomValue = source[randomIndex]; 13 Console.WriteLine(randomValue); 14} 15

投稿2017/02/02 06:41

alg

総合スコア2019

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

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

Yoshikun_0945

2017/02/02 07:00 編集

解答されているリストと比較して、リストは18個のままで特定の数字をの数増減したり、数字の数の増減に伴ってリストが18個から20個になるなどの増減の調整を行ったリストを作成した場合 リストの宣言以外のコードは変更する必要ありますか?
alg

2017/02/02 07:20

特に変更する必要はないと思います。 乱数の取得を`source.Count`未満になるようにやっていますので。 実際に試してみると、確信が持てるのではないでしょうか。
guest

0

algさんの回答が完璧すぎるので、ちょっと違う回答もしてみました。
0から7のように少ない範囲で特定の数字だけ確率を下げる場合はalgさんの投稿でよいですが、0から1000の内、1,2,3だけ確立を下げるような場合には大変なので、そこを改善してみました。
日本語のクラス名と変数名に関してのツッコミは無しでお願いします。

C#

1using System; 2using System.Collections.Generic; 3 4namespace ConsoleApplication4 5{ 6 class 確率調整 7 { 8 public int 出た回数 { get; set; } 9 public int 出にくさ { get; set; } 10 } 11 class Program 12 { 13 static void Main(string[] args) 14 { 15 Dictionary<int, 確率調整> list = new Dictionary<int, 確率調整>() 16 { 17 {1,new 確率調整{ 出た回数 = 0, 出にくさ = 7}}, 18 {2,new 確率調整{ 出た回数 = 0, 出にくさ = 10}}, 19 {3,new 確率調整{ 出た回数 = 0, 出にくさ = 11}}, 20 }; 21 22 Random random = new Random(); 23 int randomValue; 24 for ( int i = 0; i < 100; i++ ) 25 { 26 randomValue = random.Next(7+1); 27// randomValue = random.Next(1000+1); 28 if (list.ContainsKey(randomValue)) 29 { 30 list[randomValue].出た回数++; 31 if (list[randomValue].出にくさ <= list[randomValue].出た回数) 32 { 33 list[randomValue].出た回数 = 0; 34 } 35 else 36 { // 再発行 37 i--; 38 continue; 39 } 40 } 41 Console.WriteLine(randomValue); 42 } 43 } 44 } 45}

投稿2017/02/02 16:42

編集2017/02/02 16:46
hikochang

総合スコア648

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問