c#唯一随机数

c#唯一随机数,c#,random,numbers,C#,Random,Numbers,我试图得到0到100之间的随机数X(其中X是一个变量),并将它们添加到DataGridView中的一行。我使用下面的代码,但问题是我需要它不可能有相同的数字两次。有没有办法确保我得到唯一的随机数 int X = 20; Random random = new Random(); int randomrow = random.Next(0, 100); for (int i = 0; i < X; i++) { int randomNumber = random.Next(0, 10

我试图得到0到100之间的随机数X(其中X是一个变量),并将它们添加到DataGridView中的一行。我使用下面的代码,但问题是我需要它不可能有相同的数字两次。有没有办法确保我得到唯一的随机数

int X = 20;
Random random = new Random();
int randomrow = random.Next(0, 100);

for (int i = 0; i < X; i++)
{
   int randomNumber = random.Next(0, 100);
   data.Rows[randomrow][3] = randomNumber;
}
intx=20;
随机=新随机();
int randomrow=random.Next(01100);
对于(int i=0;i

谢谢你的帮助

将问题一分为二:

  • 创建X个随机唯一数字的列表。有很多方法可以做到这一点:

    a。创建一个所有数字0-100的列表,然后单击。或

    b。保留一个已创建的所有数字的散列集(除列表外),仅在以前未添加的情况下添加一个新数字

  • 然后,同时循环遍历列表和数据行,并将值插入行中


  • 将问题一分为二:

  • 创建X个随机唯一数字的列表。有很多方法可以做到这一点:

    a。创建一个所有数字0-100的列表,然后单击。或

    b。保留一个已创建的所有数字的散列集(除列表外),仅在以前未添加的情况下添加一个新数字

  • 然后,同时循环遍历列表和数据行,并将值插入行中


  • 您需要将您已经使用的数字与从random.next获得的下一个数字进行比较。如果您已经使用过,请选择另一个。我也喜欢海因茨的答案。

    你需要将你已经使用的数字与你从random获得的下一个数字进行比较。下一步。如果您已经使用过,请选择另一个。我也喜欢Heinzi的答案。

    这里有一个简单的方法,不必为列表创建洗牌方法(尽管有这样的例子)。基本上,创建一个包含所有可能整数的列表,填充该列表,然后按新GUID排序

            int X = 20;
            var RowNumbers = new List<int>();
    
            for (int i = 0; i < X; i++)
                RowNumbers.Add(i);
    
            foreach (int i in RowNumbers.OrderBy(f => Guid.NewGuid()))
            {
                data.Rows[i][3] = i;
            }
    
    intx=20;
    var RowNumbers=新列表();
    对于(int i=0;iGuid.NewGuid())中的int i)
    {
    数据行[i][3]=i;
    }
    
    以下是一种简单的方法,无需为列表创建洗牌方法(尽管有这样的示例)。基本上,创建一个包含所有可能整数的列表,填充该列表,然后按新GUID排序

            int X = 20;
            var RowNumbers = new List<int>();
    
            for (int i = 0; i < X; i++)
                RowNumbers.Add(i);
    
            foreach (int i in RowNumbers.OrderBy(f => Guid.NewGuid()))
            {
                data.Rows[i][3] = i;
            }
    
    intx=20;
    var RowNumbers=新列表();
    对于(int i=0;iGuid.NewGuid())中的int i)
    {
    数据行[i][3]=i;
    }
    
    这是一个不带洗牌的算法和以前使用的结果:

    var max = 100; // max available value
    var count = 20; // number of random numbers
    
    var random = new Random();
    var rest = (double)max;
    for (int i = 0; i < max; i++, rest--)
    {
        if (count / rest > random.NextDouble())
        {
            Console.WriteLine(i); // here is your random value
            count--;
    
            if (count == 0)
            {
                break;
            }
        }
    }
    
    var max=100;//最大可用值
    变量计数=20;//随机数
    var random=新的random();
    var rest=(双)最大值;
    对于(int i=0;irandom.NextDouble())
    {
    Console.WriteLine(i);//这是您的随机值
    计数--;
    如果(计数=0)
    {
    打破
    }
    }
    }
    
    这是一个不带洗牌的算法和以前使用的结果:

    var max = 100; // max available value
    var count = 20; // number of random numbers
    
    var random = new Random();
    var rest = (double)max;
    for (int i = 0; i < max; i++, rest--)
    {
        if (count / rest > random.NextDouble())
        {
            Console.WriteLine(i); // here is your random value
            count--;
    
            if (count == 0)
            {
                break;
            }
        }
    }
    
    var max=100;//最大可用值
    变量计数=20;//随机数
    var random=新的random();
    var rest=(双)最大值;
    对于(int i=0;irandom.NextDouble())
    {
    Console.WriteLine(i);//这是您的随机值
    计数--;
    如果(计数=0)
    {
    打破
    }
    }
    }
    
    使用列表保存随机值。当您生成一个新的时,请检查它是否存在于该列表中,如果存在,则生成一个新的,然后将它们全部添加到DataGridView中您希望
    randomrow
    是唯一的吗?或者
    randomNumber
    ?如果想要一个真正的随机值,则需要使用除
    random
    类以外的其他类。为了生成真实的,您可以使用类似于
    RNGCryptoServiceProvider
    的东西。为什么randomrow从不更改?您正在更新同一行x次。请使用列表保存随机值。当您生成一个新的时,请检查它是否存在于该列表中,如果存在,则生成一个新的,然后将它们全部添加到DataGridView中您希望
    randomrow
    是唯一的吗?或者
    randomNumber
    ?如果想要一个真正的随机值,则需要使用除
    random
    类以外的其他类。为了生成真实的,您可以使用类似于
    RNGCryptoServiceProvider
    的东西。为什么randomrow从不更改?您正在对同一行进行x次更新。列表应该是@Matiascero:我不这么认为:哈希集没有定义的顺序,因此不可能进行洗牌。将列表设置为0到100也不会有重复项,然后洗牌基本上是O(n)。这比生成随机唯一的数字要好得多,重做所有已经存在的数字,同时拥有越来越多的已经存在的数字。@YoryeNathan哦,我现在明白了,我的错@Matiascero:但是如果OP坚持他的原始算法,那么你建议使用哈希集是很好的。我已经添加了这个选项。列表应该是@Matiascero:我不这么认为:哈希集没有定义的顺序,所以洗牌是不可能的。制作一个0到100的列表也不会有重复的,然后洗牌基本上是O(n)。这比生成随机唯一的数字要好得多,重做所有已经存在的数字,同时拥有越来越多的已经存在的数字。@YoryeNathan哦,我现在明白了,我的错@Matiascero:但是如果OP坚持他的原始算法,那么你建议使用哈希集是很好的。我已经添加了这个选项。