首先,我不是C#的专家,所以我很欣赏那些简单的答案。并提前感谢..
我有一个包含30个元素的数组,所有元素都是整数,并且彼此不同。我想制作一个长度为6的另一个数组。并且从30length one指定元素到这里,但我不希望数字出现多于一个。 我尝试了随机功能,显然可以在那里出现相同的数字。我可以添加语句,但我认为必须有一个简短的方法。
我想问问大家是否有,如果有,请与我分享,再次感谢。
int [] nums = new int[30];
for (int i = 0; i < nums.Length; i++)
{
nums[i] = i + 1;
}
Random rnd = new Random();
int[] card1 = new int[6];
for (int i = 0; i < card1.Length; i++)
{
card1[i] = nums[rnd.Next(0, 30)];
}
答案 0 :(得分:3)
所以你的问题,自由翻译是:
我有一个包含1到30之间值的顺序数字数组。我想从随机位置中选择此数组中的6个唯一值。
对此的接受解决方案是正确地(例如Fisher-Yates)对阵列进行洗牌,并简单地从前面获取所需元素的数量。
鉴于您可能希望保持原始数组的顺序,您可以创建一个副本并随机播放。
看起来像这样:
var sourceArray = // your loop, or something like Enumerable.Range(1, 30).ToArray();
var arrayToPickFrom = Shuffle(sourceArray.ToArray()); // make a copy and shuffle it
var randomCards = arrayToPickFrom.Take(6); // take the first six elements
或者,问题可以简化:
我想生成1到M之间的N个随机唯一数字。
甚至更少的代码行。但这一切都取决于您的要求。如果你真的想要创建一个纸牌游戏,那么在最初的六张牌之后会有更多的牌 - 并且一张牌只能被抽一次,你应该完全不同于这个问题,对于初学者来说,通过引入一个Deck类来包含所有卡片,方便的方法...
答案 1 :(得分:0)
还有其他方法可以解决这个问题,但由于您要求简化,我会尽量不改变您的代码。
Random rnd = new Random();
var values = new List<int>(nums); // 1
int[] card1 = new int[6];
for (int i = 0; i < card1.Length; i++)
{
var rand = rnd.Next(0, values.Count); // 2
card1[i] = values[rand]; // 3
values.RemoveAt(rand); // 4
}
List
数组中创建nums
。the created list
元素复制到card1
数组; 我必须说,尽管这是一个简单的解决方案,但它绝不是最“高效”的解决方案。
答案 2 :(得分:-1)
为什么不采取前6个?
var theOtherArray = Nums.Take(6).ToArray();
答案 3 :(得分:-1)
一个简单的解决方案:
int[] card1 = nums.OrderBy(it => Guid.NewGuid()).Take(6).ToArray();
通过新的guid对原始数组进行排序应该可以为您提供相当接近的随机性,同时避免明确防止重复的要求。
然后你只需要获得前6个结果。
警告: guid排序的随机行为是当前Guid.NewGuid()方法的一个实现细节,因此重要的是不要依赖此功能 - 尤其是生产代码。
更好的实现会使用Fisher-Yates shuffle,例如,请参阅此帖子:https://stackoverflow.com/a/1653204/5438433