【发布时间】:2017-09-16 03:16:03
【问题描述】:
我想检查我在 shuffle 方法中传递的数组是否有任何重复项。 我还想生成一个大小为 a.length 的随机数。
问题是我不知道如何检查数组是否有重复,如果有,它会生成另一个数字,直到它与其他数字不同。
public int[] Shuffle(int[] a)
{
//check if the array has duplicates
for (int i = 0; i < a.Length; i++)
{
int curValue = random.Next(a.Length);
if(a.Contains(curValue))
{
curValue = random.Next(a.Length);
}
else
{
a[i] = curValue;
}
}
for (int i = 0; i < a.Length; i++)
{
int r = random.Next(a.Length);
int t = a[r];
a[r] = a[i];
a[i] = t;
}
return a;
}
谁能帮帮我?
【问题讨论】:
-
这似乎是一件奇怪的事情(输入数组是什么?只有它的大小重要吗?E:编辑后使用输入,但以一种奇怪的方式),也是你的洗牌部分以一种偷偷摸摸且难以察觉的方式是错误的。
-
首先我想用随机数填充我的数组取决于我的array.length。但是我不想重复,然后我想根据数组长度在随机位置随机排列我的数组。有什么建议吗?
-
了解 Linq 的
.Distinct()方法。至于所有一起生成随机唯一数字的集合,在 SO 中搜索更多,我在过去看到了很多解决方案 -
如果你只想要数字 0 .. a.length - 1,你可以用一种简单的方式 (
a[i] = i) 将它们放在那里,然后随机播放它们(查找 Knuth shuffle ,真的很容易弄错乱序) -
我建议您使用Fisher-Yates shuffle。基本上在集合大小范围内生成一个随机数,从该位置获取值,然后将其从集合中删除,使下次范围变小。重复直到集合为空。
标签: c# random numbers generator