1

私はビンゴゲームを作成してRandomおり、配列で乱数を生成するために使用してintいますが、ここでの問題は、インデックスで数値が再度使用されることがあることです。インデックスの数値を一意にするにはどうすればよいですか?

これが私の仕事です:

namespace Bingo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

    Random randNum1 = new Random();

    int[] random1 = new int[5];
    int qwe = 0;
    int i = 0;

    private void button1_Click(object sender, EventArgs e)
    {
        Class1 class1 = new Class1();
        class1.checker(this);

        if (label1.Text == label2.Text || label3.Text == label4.Text) {

            label2.Text = randNum1.Next(1, 15).ToString();
            label4.Text = randNum1.Next(1, 15).ToString();
        }

        if (label5.Text == label1.Text || label5.Text == label2.Text) {

            label5.Text = randNum1.Next(1, 15).ToString();            
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Class1 class1 = new Class1();

        class1.SetTwo(this);

        for (int i = 0; i < random1.Length; i++)
        {
            random1[i] = randNum1.Next(1, 15);

            label1.Text = random1[0].ToString();
            label2.Text = random1[1].ToString();
            label3.Text = random1[2].ToString();
            label4.Text = random1[3].ToString();
            label5.Text = random1[4].ToString();
        }
    }
}
4

4 に答える 4

2

Scott Mermelsteinの回答の図が役立つかもしれないと考えました:

List<int> AvailableNumbers;
Random random; 
private void Form1_Load(object sender, EventArgs e)
{
    //Create a list of numbers, 1-14
    AvailableNumbers = Enumerable.Range(1, 14).ToList();
    random = new Random();

    label1.Text = GetNextNumber().ToString();
    label2.Text = GetNextNumber().ToString();
    label3.Text = GetNextNumber().ToString();
    label4.Text = GetNextNumber().ToString();
    label5.Text = GetNextNumber().ToString();
}
private int GetNextNumber()
{
    //Get a random index within the bounds of AvailableNumbers
    var nextIndex = random.Next(0, AvailableNumbers.Count);

    var nextNumber = AvailableNumbers[nextIndex];
    AvailableNumbers.RemoveAt(nextIndex);

    return nextNumber;
}
于 2013-10-09T14:28:03.857 に答える
1

別のアプローチは、ソートされた数字のリストをシャッフルすることです。

var numbers = Enumerable.Range(1, 15).OrderBy(i => Guid.NewGuid()).ToArray();

これはどのように作動しますか?

  • 整数のリストから始める ( Enumerable.Range(1, 15) => [1, 2, 3, ..., 15])
  • それらを並べ替えます ( OrderBy)
  • 「ランダム」インデックスでGuid.NewGuid()

明らかに、これはGuid.NewGuid()連続した GUID を生成しない場合にのみ機能しますが、GUID アルゴリズムの最初の実装ではセキュリティ上の問題があったため、デフォルトでは機能しないと思います。

(ここから GUID のヒントを使用したシャッフルを取得しました: Randomize a List<T> )

他のより効率的な方法を使用して「デッキ」をシャッフルすることもできますが、ビンゴ スタイルのアプリケーションの場合、これはうまく機能するはずです。

別のアイデア:

var rand = new Random();
var numbers = Enumerable.Range(1, 15).OrderBy(i => rand.Next()).ToArray();

開始リストの要素は一意であるため、結果はそのプロパティを再現することが保証されています。

于 2013-10-09T14:16:15.793 に答える