前提・実現したいこと
乱数の偏りをなくしたい
初めて質問します。
初心者用の本を見ながら(作って覚えるVisual C# 2017)
間違い漢字探しのwindowsフォームアプリを作っています。
本には正しい漢字が1か所だけに、他の箇所には間違いの漢字(一種類)を表記させるように載っていますが、
自分で応用的に間違いとして出現する漢字をランダムに出現させようと思い
間違いの漢字リストを別クラスに置き、
enumで番号を振った後、その番号をランダムに発生させるコードを書きました。
が、出現する漢字がものすごく偏ります(間違いの漢字が1~2種類ぐらいしか出現しない)
何故なのでしょうか?
発生している問題・エラーメッセージ
エラーメッセージ
エラーメッセージはなし
該当のソースコード
C#
1~メインフォーム~ 2using System; 3using System.Collections.Generic; 4using System.ComponentModel; 5using System.Data; 6using System.Drawing; 7using System.Linq; 8using System.Text; 9using System.Threading.Tasks; 10using System.Windows.Forms; 11 12namespace FukushimaDifferenceHunt 13{ 14 public partial class FormGame : Form 15 { 16 17 string correctText = "福嶋"; 18 double nowtime;//経過時間 19 public FormGame() 20 { 21 InitializeComponent(); 22 } 23 24 private void bunttons_Click(object sender, EventArgs e) 25 { 26 if (((Button)sender).Text == correctText) 27 { 28 //when 25buntton click 29 timer1.Stop();//計測終了 30 } 31 else 32 { 33 nowtime = nowtime + 10;//ペナルティ 34 } 35 } 36 37 private void timer_Tick(object sender, EventArgs e) 38 { 39 //0.02秒おきに呼ばれるタイマーのいべんとはんどる 40 nowtime = nowtime + 0.5; 41 textTimer.Text = nowtime.ToString("0.00"); 42 43 } 44 45 private void bunttonStart_Click(object sender, EventArgs e) 46 { 47 textHunt.Text = correctText; 48 Random rnd = new Random(); 49 int randomResult= rnd.Next(25); 50 51 //splitcontainerの下のパネル2に載っているボタンのテキストを全て間違いの文字にする 52 for (int i =0;i < splitContainer1.Panel2.Controls.Count;i++) 53 { 54 var random = new Random(); 55 var mistakesvalue = random.Next(Enum.GetNames(typeof(mistakes)).Length); 56 var mistakesnumber = (mistakes)mistakesvalue; 57 switch(mistakesnumber) 58 { 59 case mistakes.伏島: 60 splitContainer1.Panel2.Controls[i].Text = "伏島"; 61 break; 62 case mistakes.副嶋: 63 splitContainer1.Panel2.Controls[i].Text = "副嶋"; 64 break; 65 case mistakes.副隝: 66 splitContainer1.Panel2.Controls[i].Text = "副隝"; 67 break; 68 case mistakes.幅嶋: 69 splitContainer1.Panel2.Controls[i].Text = "幅嶋"; 70 break; 71 case mistakes.幅隝: 72 splitContainer1.Panel2.Controls[i].Text = "幅隝"; 73 break; 74 case mistakes.愊隝: 75 splitContainer1.Panel2.Controls[i].Text = "愊隝"; 76 break; 77 case mistakes.服隝: 78 splitContainer1.Panel2.Controls[i].Text = "服隝"; 79 break; 80 case mistakes.楅嶋: 81 splitContainer1.Panel2.Controls[i].Text = "楅嶋"; 82 break; 83 case mistakes.福島: 84 splitContainer1.Panel2.Controls[i].Text = "福島"; 85 break; 86 case mistakes.福嶌: 87 splitContainer1.Panel2.Controls[i].Text = "福嶌"; 88 break; 89 case mistakes.福縞: 90 splitContainer1.Panel2.Controls[i].Text = "福縞"; 91 break; 92 case mistakes.福隝: 93 splitContainer1.Panel2.Controls[i].Text = "福隝"; 94 break; 95 } 96 97 } 98 //ランダムで一つだけ正解の文字にする 99 splitContainer1.Panel2.Controls[randomResult].Text = correctText; 100 101 //タイマースタート 102 nowtime = 0; //タイマーの初期化 103 timer1.Start(); 104 } 105 106 private void FormGame_Load(object sender, EventArgs e) 107 { 108 for (int i = 0; i < splitContainer1.Panel2.Controls.Count; i++) 109 { 110 splitContainer1.Panel2.Controls[i].Text = null; 111 } 112 } 113 } 114} 115 116 117~ここから別クラス~ 118namespace FukushimaDifferenceHunt 119{ 120 enum mistakes 121 { 122 福隝, 123 福嶌, 124 幅嶋, 125 幅隝, 126 副隝, 127 副嶋, 128 福島, 129 愊隝, 130 楅嶋, 131 服隝, 132 伏島, 133 福縞 134 135 } 136 137}
試したこと
最初はswith文ではなく(漢字ごとにわざわざ分岐させるのは面倒なので)、random.Next(Enum.GetNames(typeof(mistakes))を文に使ってループ処理させ
文章を短くしてましたが、出現漢字が偏るので
swith文にしましたが、出現漢字が偏ったままでした。
デバックモードでF10を一行1行押しつつ実行すると
均等な率で間違えの漢字が出現するのですが、
どこにもブレークポイントを付けずに実行をすると偏ってしまいます。
何故なのでしょうか???
補足情報(FW/ツールのバージョンなど)
VS2019
ここにより詳細な情報を記載してください
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/10 06:24