如何让随机发生器随机化,直到它成为正确的数字

时间:2017-03-11 17:00:51

标签: c# random

我正在进行数独游戏,起初我正在做小版本的3x3。经过一些编码后,我无法找到方法:

如何使S随机化直到它的正确数字(S随机化,Skaiciai.Neradau意味着它没有找到重复的数字,Skaiciai.Yra_Toks_Skaicius意味着他找到了相同的数字已经使用过)

编辑:用英语重做

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _3x3
{
    public partial class Form1 : Form
    {
        TextBox[] Boxes;

        public Form1()
        {
            InitializeComponent();
            Boxes = new TextBox[] { textBox1, textBox2, textBox3};
        }

        public enum Numbers
        {
            Found_Number,
            NotFound
        };

        private void button1_Click(object sender, EventArgs e)
        {
            Random X = new Random();

            for (int i = 0; i < 3; i++)
            {
                int S = X.Next(1, 4);

                switch (i)
                {
                    case 0:
                        int A, B;
                        if (textBox2.Text == "") { A = 0; } else { A = int.Parse(textBox2.Text); }
                        if (textBox3.Text == "") { B = 0; } else { B = int.Parse(textBox3.Text); }
                        Numbers R = CheckIfThereIsNumber(S, new int[] { A, B });
                        if (R == Numbers.NotFound)
                        {
                            textBox1.Text = S.ToString();
                        }
                        break;
                    case 1:
                        int C, D;
                        if (textBox1.Text == "") { C = 0; } else { C = int.Parse(textBox1.Text); }
                        if (textBox3.Text == "") { D = 0; } else { D = int.Parse(textBox3.Text); }
                        Numbers T = CheckIfThereIsNumber(S, new int[] { C, D });
                        if (T == Numbers.NotFound)
                        {
                            textBox2.Text = S.ToString();
                        }
                        break;
                    case 2:
                        int E, F;
                        if (textBox1.Text == "") { E = 0; } else { E = int.Parse(textBox1.Text); }
                        if (textBox2.Text == "") { F = 0; } else { F = int.Parse(textBox2.Text); }
                        Numbers Y = CheckIfThereIsNumber(S, new int[] { E, F });
                        if (Y == Numbers.NotFound)
                        {
                            textBox3.Text = S.ToString();
                        }
                        break;
                }
            }
        }

        Numbers CheckIfThereIsNumber(int _searchednumber, int[] _numbers)
        {
            Numbers Result = Numbers.NotFound;
            for (int i = 0; i < _numbers.Length; i++)
            {
                if (_numbers[i] == _searchednumber)
                {
                    Result = Numbers.Found_Number;
                }
            }
            return Result;
        }
    }
}

2 个答案:

答案 0 :(得分:2)

正确的方法是不将数字本身随机化,而是列出未使用的数字并随机播放列表中的哪个数字。

List<int> notUsed = findUnusedNumbers();

while (notUsed.Count) {
    int randomIndex = X.Next(0, notUsed.Count);
    int myChosenNumber = notUsed.get(randomIndex);
    // do something with the number here
    notUsed.RemoveAt(randomIndex);
}

答案 1 :(得分:0)

为什么你甚至在这里使用随机数?

我以前做过数独求解器,没有任何随机数。你想迭代各种可能性,而不是随机选择。

鉴于你说你没有被教过那些列表操作,如果你必须使用随机数,只需继续尝试,直到你得到一个有效的。