如何填充每个索引中具有唯一编号的int数组?

时间:2013-10-09 14:00:15

标签: c# arrays if-statement random

我正在创建一个宾果游戏,我正在使用Randomint数组中生成随机数,但我的问题是有时在索引中再次使用一个数字。如何使索引中的数字唯一?

这是我的工作:

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 个答案:

答案 0 :(得分:7)

循环问题直到你发现一个未使用的循环问题是随着游戏的进行,你需要花费更长的时间才能找到一个有效的数字。从理论上讲,你的循环永远不会结束(极有可能,但仍然......)

最简单的事情是在真正的宾果游戏中发生的事情。从有限的集合开始,实际上每次绘制时都从集合中删除项目。使用初始可能性填充List或任何其他动态索引容器,随机选择从0到列表大小的索引,然后从列表中删除选择。

这将保证每个选择都会产生唯一的结果,而不会产生循环。

答案 1 :(得分: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;
}

答案 2 :(得分: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算法的第一个实现的安全问题。

(我从这里得到了GUIDs提示: Randomize a List<T>

您可以使用其他更有效的方法来改组“套牌”,但对于Bingo风格的应用程序,这应该可以正常工作。

另一个想法:

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

由于起始列表中的元素是唯一的,因此保证结果能够重现该属性。

答案 3 :(得分:0)

每当你拿到一个新号码时,只需用它包围它:

int num;
do
{
   num = randNum1.Next(1, 15);
}
while(random1.Contains(num))

random1[i] = num;

保证它是唯一的