使用c#从数组中随机选取4个元素

时间:2011-11-16 21:09:48

标签: c# c#-2.0

我试图在C#中使用随机函数从数组addetailsID中随机选择四个,这个数组有六个以上的元素。

我将这些随机挑选放入另一个数组strAdDetailsID

 string[] strAdDetailsID = new string[4];
 for (int i = 0; i < 4; i++)
 {
     Random random = new Random();
     int index = random.Next(0, addetailsID.Length);
     value = addetailsID[index].ToString();
     strAdDetailsID[i] = value;
 }

有时候,我从六个元素中得到两个相同的值。如何获取所有四个唯一值?

8 个答案:

答案 0 :(得分:6)

您可能最好关闭shuffling数组,然后选择前4个元素。

答案 1 :(得分:5)

你可以用这种方法用LINQ来做。

List<string> list = new List<string>() { "There", "Are", "Many", "Elements", "To", "Arrays" };

foreach (var item in list.OrderBy(f => Guid.NewGuid()).Distinct().Take(4))
{
    Console.WriteLine(item);
}

答案 2 :(得分:3)

您对Random random ...的展示位置有疑问,但我相信您是以错误的方式进行攻击。

这可以通过随机排序来源和前4项来解决。

var result = addetails.OrderBy(x => Guid.NewGuid()).Take(4).ToArray();

假设addetails的内容是唯一的(就像你暗示的那样),你总会得到4个唯一值。正确使用随机,仍然可以获得重复(因为它是随机)。

答案 3 :(得分:2)

将它们放入列表中,并在选择后从列表中删除所选元素。

答案 4 :(得分:2)

首先需要生成4个唯一索引,然后从源数组中提取随机值:

        string[] addetailsID = new string[20];  // this is the array I want to index into
        // generate the 4 unique indices into addetailsID
        Random random = new Random();
        List<int> indices = new List<int>();
        while (indices.Count < 4)
        {
            int index = random.Next(0, addetailsID.Length);
            if (indices.Count == 0 || !indices.Contains(index))
            {
                indices.Add(index);
            }
        }
        // now get the 4 random values of interest
        string[] strAdDetailsID = new string[4];
        for (int i = 0; i < indices.Count; i++)
        {
            int randomIndex = indices[i];
            strAdDetailsID[i] = addetailsID[randomIndex];
        }

答案 5 :(得分:1)

以下算法运行良好,不需要额外的存储或预先混洗。它确实改变了源数组的顺序,所以如果这不可行,那么预先混洗的方法是最好的。

在伪代码中:

result = []
For i = 0 to numItemsRequired:
    randomIndex = random number between i and source.length - 1
    result.add(source[randomIndex])
    swap(source[randomIndex], source[i])

在C#中:

string[] strAdDetailsID = new string[4];
Random rand = new Random();

for (int i = 0; i < 4; i++)
{
    int randIndex = rand.Next(i, adDetailsID.Length);
    strAddDetails[i] = adDetailsID[randIndex];

    string temp = adDetailsID[randIndex];
    adDetailsID[randIndex] = adDetailsID[i];
    adDetails[i] = temp;
}

答案 6 :(得分:0)

那么,您应该逐个选择随机项目,而不是在选择下一个项目时考虑已经挑选的项目。这必须比洗牌更快。

如果源列表很小,您只需制作副本并从中删除所选项目即可。否则,你会这样:

(让n为数组中的项目数)

  1. 让S成为所选指数的集合; S =开头是空的
  2. 从0到i
  3. 选择随机索引n-1-size(S)
  4. 对于S中小于i的每个索引(从最小索引开始!),添加一个到i
  5. 现在i是一个选定的索引,将其添加到S
  6. 返回第2步,直到您的集合包含4个元素。

答案 7 :(得分:0)

使用列表代替并删除已使用的每个项目:

 List<string> addetailsID = new List<string>{"1","2","3","4","5","6"};

 string[] strAdDetailsID = new string[4];
 Random random = new Random();
 for (int i = 0; i < 4; i++)
 {

     int index = random.Next(0, addetailsID.Count);
     string value = addetailsID[index].ToString();
     addetailsID.RemoveAt(index);
     strAdDetailsID[i] = value;
 }

  strAdDetailsID.Dump();