如何从数组中提取3个随机值?

时间:2011-07-21 13:38:35

标签: c#

我使用:

构建MyObject数组
    MyObject[] myObject = (from MyObject varObj in MyObjects
                           select varObj).ToArray();

现在,我想从这个数组中提取3个随机MyObject!我怎么能在C#上做到?

当然,如果数组长度<3,我需要提取所有对象!

6 个答案:

答案 0 :(得分:8)

您可以通过Linq执行此操作:

  1. 以随机顺序检索项目(请参阅Jon Skeet's answer to this SO question
  2. 使用 Take 运算符
  3. 选择结果列表的Top(3)

    例如,随机选择3个流程:

    var ps = (from p in Process.GetProcesses() orderby Guid.NewGuid() select p).Take(3);
    

    你也可以使用random.Next()代替Guids(严格来说,正如LukeH所指出的那样,Guids是唯一的,但不是随机的。)

答案 1 :(得分:3)

        MyObject[] myObject = ...;
        int upper = 1;
        if (myObject.Length > 1)
        {
            Random r = new Random();
            upper = Math.Min(3, myObject.Length);
            for (int i = 0; i < upper; i++)
            {
                int randInd = r.Next(i, myObject.Length);
                MyObject temp = myObject[i];
                myObject[i] = myObject[randInd];
                myObject[randInd] = temp;
            }
        }

现在将数组的元素从0转换为upper

答案 2 :(得分:1)

使用RandomC#,您可以获得小于特定数字的随机int,在您的情况下,其大小为myObject

我不确定您是否想要独特或者可以复制。

答案 3 :(得分:1)

怎么样?

Random r = new Random();
int item1 = r.Next(0, myObject.Length);
int item2 = r.Next(0, myObject.Length);
int item3 = r.Next(0, myObject.Length);

var result1 = myObject[item1];
var result2 = myObject[item2];
var result3 = myObject[item3];

没有Linq或任何东西,但它完成了工作。

答案 4 :(得分:1)

这个怎么样:

 var random = new Random();
 var objs = new Object[] { 1, 2, 3, 4, 5, 6, 7, 8 };
 var result = objs.OrderBy(o => random.Next(Int32.MaxValue)).Take(3);

答案 5 :(得分:1)

更有创意。

 var list = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 4, 1, 2, 3, 44, 5, 6 };
 Random random = new Random();
 var results = list.OrderBy(i => random.Next()).Take(3);

输出:

results: {int[3]}
[0]: 3
[1]: 2
[2]: 5