c#唯一随机数
我试图得到0到100之间的随机数X(其中X是一个变量),并将它们添加到DataGridView中的一行。我使用下面的代码,但问题是我需要它不可能有相同的数字两次。有没有办法确保我得到唯一的随机数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
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
谢谢你的帮助 将问题一分为二:
将问题一分为二:
您需要将您已经使用的数字与从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坚持他的原始算法,那么你建议使用哈希集是很好的。我已经添加了这个选项。