【问题标题】:Why is my array changing back and forth each time i press the button?为什么每次按下按钮时我的阵列都会来回变化?
【发布时间】:2017-03-08 05:19:48
【问题描述】:

C# Windows 窗体应用程序 - Visual Studio

这是我的代码,它在文本框中一步一步地创建一个数组并按数值对其进行排序。唯一的问题是,当我多次单击该按钮时,它会在实际数组和似乎是另一个随机数组之间切换。这是为什么呢?

    int[] randArray = new int[5];
    private void txtSeed_TextChanged(object sender, EventArgs e) {
        int notaninteger;
        if (!int.TryParse(txtSeed.Text, out notaninteger)) {
            txtSeed.Text = "0";
        }
        if (int.Parse(txtSeed.Text) < 0) {
            txtSeed.Text = "0";
        }
    }
    private void btnLotto_Click(object sender, EventArgs e) {
        fillArray();
        sortArray();
        showResult();
    }
    private void fillArray() {
        bool inArray = true;
        Random random = new Random(int.Parse(txtSeed.Text));
        for (int i = 0; i < randArray.Length; i++) {
            do {
                int randomNumber = random.Next(1, 51);
                inArray = checkArray(randomNumber);
                if (!inArray) {
                    randArray[i] = randomNumber;
                }
            }
            while (inArray);
        }
    }
    private void displayArray() {
        txtLotto.AppendText(getFormat());
        txtLotto.AppendText("\r\n");
    }
    private void sortArray() {
        txtLotto.Text = "";
        for (int i = 0; i < randArray.Length; i++) {
            for (int j = 0; j < randArray.Length - 1; j++) {
                if (randArray[j] > randArray[j + 1]) {
                    swap(ref randArray[j], ref randArray[j + 1]);
                    displayArray();
                }
            }
        }
    }
    private bool checkArray(int a) {
        for (int i = 0; i < randArray.Length; i ++) {
            if (randArray[i] == a) {
                return true;
            }
        }
        return false;
    }
    private string getFormat() {
        string format = "";
        for (int i = 0; i < randArray.Length; i ++) {
            if (i != 0) {
                format += "-";
            }
            format += randArray[i];
        }
        return format;
    }
    private void showResult() {
        lblFinalResult.Text = "Final Result:    ";
        string format = "";
        for (int i = 0; i < randArray.Length; i++) {
            if (i != 0) {
                format += "-";
            }
            format += randArray[i];
        }
        lblFinalResult.Text += format;
    }
    private void swap(ref int a, ref int b) {
        int tempA = a;
        a = b;
        b = tempA;
    }

【问题讨论】:

  • 整个应用只需要一个 Random 实例,而不是每次填充操作。此外,随机并不意味着唯一 - 大多数乐透会使用 1 到 50(包括)之间的 50 个唯一数字
  • 一个随机实例是什么意思?
  • @TylerArnett 不是随机的。随机的。例如,Random 的一个实例。
  • @Plutonix 你的建议似乎是反对代码 OP 试图写出种子来自文本框的位置(因此序列在手动更新种子之前保持不变)......
  • 请注意,如果您需要在特定范围内生成随机数字列表的实际代码(也称为“唯一随机数”) - 只需使用 stackoverflow.com/questions/273313/randomize-a-listt 随机播放 1..n 的序列,并可能采取.Take() 需要的元素...

标签: c# arrays winforms visual-studio bubble-sort


【解决方案1】:

https://msdn.microsoft.com/en-us/library/system.random(v=vs.110).aspx

如果相同的种子用于不同的 Random 对象,它们将 生成同一系列的随机数。

你有两种不同类型的数组的原因是:

  1. 请注意,在使用相同种子初始化后,Random 将始终生成,例如:1,2,3,4,5,6,7,8,9,10。
  2. 您使用前 5 个系列填充数组,例如:1,2,3,4,5。
  3. 下次它尝试填充相同数量的 1,2,3,4,5,但您的代码无法做到这一点,因为您避免输入重复项,因此您获取并使用下一个 5 系列填充数组,例如:6,7,8,9,10
  4. 下次尝试填充数组时,它会再次尝试填充相同数量的 1,2,3,4,5,您成功输入到数组中。
  5. 重复 3~4 次

为了解决您的问题,基本上规则只是创建一个 Random 实例并避免重新初始化(使用相同的种子)。因此,每次点击总是会得到不同的数组。

private Random random = new Random(); // one instance of random
private int previousSeed = 0; // memorize previous seed
private void fillArray()
{
    bool inArray = true;
    int newSeed = int.Parse(txtSeed.Text);
    if (newSeed != previousSeed)
    {
        // reinitialize the random only if new seed is different
        random = new Random(newSeed);
        previousSeed = newSeed;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多