随机数生成器,没有重复

Pad*_*y85 11 c#

基本上我正在创建一个程序来随机生成6个独特的彩票号码,所以在同一行中没有重复,这是我到目前为止的代码...

        //Generate 6 random numbers using the randomiser object

        int randomNumber1 = random.Next(1, 49);
        int randomNumber2 = random.Next(1, 49);
        int randomNumber3 = random.Next(1, 49);
        int randomNumber4 = random.Next(1, 49);
        int randomNumber5 = random.Next(1, 49);
        int randomNumber6 = random.Next(1, 49);

        textBox1.Text = randomNumber1.ToString();
        textBox2.Text = randomNumber2.ToString();
        textBox3.Text = randomNumber3.ToString();
        textBox4.Text = randomNumber4.ToString();
        textBox5.Text = randomNumber5.ToString();
        textBox6.Text = randomNumber6.ToString();

    }
Run Code Online (Sandbox Code Playgroud)

我得到随机数,但有时在同一行上有相同的数字,我如何使每个数字唯一????

提前致谢

Sel*_*enç 32

您需要将它们存储在一个集合中,每次选择一个新的数字时,您需要确保它不存在,否则您需要生成一个新的数字,直到找到一个唯一的数字.

而不是这样,我会在1和之间生成一个序列49,将它们随机抽取并从序列中挑出6个数字,例如:

var rnd = new Random();
var randomNumbers = Enumerable.Range(1,49).OrderBy(x => rnd.Next()).Take(6).ToList();
Run Code Online (Sandbox Code Playgroud)

  • 这导致一些偏向于小数字,但它相当小,在大多数情况下都可以忽略. (2认同)

Jam*_*nen 10

你不能.您只指定每个数字是从1到49的随机数,而不是它不应该与任何重复数字匹配.

由于你有一组相对较小的数字,你最好的选择可能是绘制随机数,将它们放入HashSet中,然后如果你需要更多,那就拉更多.像这样的东西:

HashSet<int> numbers = new HashSet<int>();
while (numbers.Count < 6) {
    numbers.Add(random.Next(1, 49));
}
Run Code Online (Sandbox Code Playgroud)

在这里,您将利用HashSet消除重复项.这不适用于List或其他集合.

  • 好点子.卡在陷阱中考虑创建六个数字,然后确定是否需要解决重复项.谢谢. (2认同)

Bat*_*eba 5

返回重复值为了一个必要性发电机来满足随机性的一个必要的统计特性:绘制数的概率不依赖于绘制以前的号码。

您可以对1到49范围内的整数进行混洗并返回前6个元素。有关此类洗牌器的更多详细信息,请参见http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

但是,我认为这样做会引起轻微的统计偏差。

最好的方法可能是使用random.Next(1, 49);和拒绝任何重复。这样就不会产生统计偏差,而且您只需要49种可能性中的6种,那么冲突的数量就不会显着降低算法的速度。

  • [以及Stackoverflow上的规范洗牌。](http://stackoverflow.com/questions/273313/randomize-a-listt-in-c-sharp/1262619#1262619) (2认同)