C#随机地将不同的数组元素指定给另一个数组

时间:2015-11-09 18:08:34

标签: c# arrays distinct

首先,我不是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)];
}

4 个答案:

答案 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
}
  1. List数组中创建nums
  2. 随机索引;
  3. 将该索引的the created list元素复制到card1数组;
  4. 从列表中删除元素,以便您无法再次复制;
  5. 我必须说,尽管这是一个简单的解决方案,但它绝不是最“高效”的解决方案。

答案 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