C# 为什么每次按下按钮时我的阵列都会来回变化?

C# 为什么每次按下按钮时我的阵列都会来回变化?,c#,arrays,winforms,visual-studio,bubble-sort,C#,Arrays,Winforms,Visual Studio,Bubble Sort,C#Windows窗体应用程序-Visual Studio 这是我的代码,它创建一个数组,并在文本框中一步一步地按数值对其排序。唯一的问题是,当我多次单击按钮时,它会在实际数组和另一个随机数组之间切换。为什么会这样 int[] randArray = new int[5]; private void txtSeed_TextChanged(object sender, EventArgs e) { int notaninteger; if (!in

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;
    }
int[]randArray=newint[5];
私有void txtsteed_TextChanged(对象发送方,事件参数e){
int notaninteger;
如果(!int.TryParse(txtSeed.Text,out notaninteger)){
txtSeed.Text=“0”;
}
if(int.Parse(txtSeed.Text)<0){
txtSeed.Text=“0”;
}
}
私有void btnLotto_单击(对象发送者,事件参数e){
fillArray();
sortArray();
showResult();
}
私有void fillArray(){
bool-inArray=true;
Random Random=新的Random(int.Parse(txtSeed.Text));
for(int i=0;i随机数组[j+1]){
交换(参考随机阵列[j],参考随机阵列[j+1]);
displayArray();
}
}
}
}
私有布尔校验数组(int a){
for(int i=0;i

如果将同一种子用于单独的随机对象,则它们将 生成相同的随机数序列

您有两种不同类型的阵列的原因是:

  • 请注意,在使用相同种子初始化之后,Random将始终生成,例如:1,2,3,4,5,6,7,8,9,10
  • 使用前5个系列填充数组,例如:1,2,3,4,5
  • 下一次它尝试用相同数量的1,2,3,4,5填充,但您的代码无法这样做,因为您避免输入重复项,因此您将获得并用下一个5系列填充数组,例如:6,7,8,9,10
  • 下次您尝试填充数组时,它会再次尝试填充相同数量的1、2、3、4、5,您成功地将其输入到数组中
  • 重复3~4次
  • 为了解决您的问题,基本上规则是只创建一个随机实例并避免重新初始化(使用相同的种子)。因此,每次单击都会得到不同的数组

    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;
        }
    

    如果将同一种子用于单独的随机对象,则它们将 生成相同的随机数序列

    您有两种不同类型的阵列的原因是:

  • 请注意,在使用相同种子初始化之后,Random将始终生成,例如:1,2,3,4,5,6,7,8,9,10
  • 使用前5个系列填充数组,例如:1,2,3,4,5
  • 下一次它尝试用相同数量的1,2,3,4,5填充,但您的代码无法这样做,因为您避免输入重复项,因此您将获得并用下一个5系列填充数组,例如:6,7,8,9,10
  • 下次您尝试填充数组时,它会再次尝试填充相同数量的1、2、3、4、5,您成功地将其输入到数组中
  • 重复3~4次
  • 为了解决您的问题,基本上规则是只创建一个随机实例并避免重新初始化(使用相同的种子)。因此,每次单击都会得到不同的数组

    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;
        }
    

    整个应用程序只需要一个随机实例,而不是每个填充操作。此外,随机并不意味着唯一-大多数乐透会使用50个介于1和50之间的唯一数字(包括)。你说的一个随机实例是什么意思?@TylerArnett Not Random。随机的如中所述,
    Random
    @puropoix的一个实例,您的建议似乎与code-OP尝试写入seed来自文本框的位置(因此序列保持不变,直到seed手动更新)……请注意,如果您需要生成特定范围内的随机数字列表的实际代码(也称为“唯一随机数”)-只需使用
    .take()
    …您只需要为整个应用程序随机创建一个实例,而不是为每个填充操作。此外,随机并不意味着唯一-大多数乐透会使用50个介于1和50之间的唯一数字(包括)。你说的一个随机实例是什么意思?@TylerArnett Not Random。随机的如中所述,
    Random
    @puropoix的一个实例,您的建议似乎与code-OP尝试写入seed来自文本框的位置(因此序列保持不变,直到seed手动更新)……请注意,如果您需要生成特定范围内的随机数字列表的实际代码(也称为“唯一随机数”)-只需使用并可能使用