Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取数组的随机顺序。orderby C_C#_Arrays_.net - Fatal编程技术网

C# 如何获取数组的随机顺序。orderby C

C# 如何获取数组的随机顺序。orderby C,c#,arrays,.net,C#,Arrays,.net,我试图从数组中找到最接近集合整数的整数,但如果有多个整数,我想随机选取一个 var nearestScore=scoreArray.OrderByx=>Math.Abslongx-realScore.First 除了先用,我不知道还有别的办法 我也试过了 var r = new random() var nearestScore = scoreArray.OrderBy(x => Math.Abs((long)x - realScore)).ToArray(); return neares

我试图从数组中找到最接近集合整数的整数,但如果有多个整数,我想随机选取一个

var nearestScore=scoreArray.OrderByx=>Math.Abslongx-realScore.First

除了先用,我不知道还有别的办法

我也试过了

var r = new random()
var nearestScore = scoreArray.OrderBy(x => Math.Abs((long)x - realScore)).ToArray();
return nearestScore[r.next(0, nearestScore.Length - 1)]

谢谢。

您可以添加扩展名FirstEqual:

public static IEnumerable<T> FirstEqual<T>(this IEnumerable<T> source)
{

      var e = source.GetEnumerator();
      if (e.MoveNext())
      {

          T first = e.Current;
          yield return first;
          while (e.MoveNext())
          {

             if (e.Current.Equals(first))
                yield return first;
              else 
                 break;
          }

      }
}
然后你打电话给我

scoreArray.OrderByx=>Math.Abslongx-realScore.FirstEqual

这将返回相等数字的集合

我们还可以返回第一个数字及其计数的元组。

您可以使用GroupBy进行此操作。这有点笨手笨脚,但对于小型阵列来说很简单

Random rnd = new Random();

var nearestScore = scoreArray
    .Select(x => new { Num = x, Delta = Math.Abs((long)x - realScore)) })
    .OrderBy(a => a.Delta)
    .GroupBy(a => a.Delta)
    .First()
    .OrderBy(a => rnd.Next())
    .Select(a => a.Num)
    .First();

用几句话来阻止它:

var minScore = scoreArray.Min(x => Math.Abs((long)x - realScore));
var list = scoreArray.Where(x => Math.Abs((long)x - realScore) == minScore).ToList();
// or you can use GroupBy with OrderBy and First instead of above, but this is lighter and cleaner
r = new Random();
var myRandomNumber = r.Next(0, list.Count);
return list[myRandomNumber];

需要进一步澄清这毫无意义。如果您的输入是100,并且数组中有97、98和99,那么99是唯一最接近的数字。如果有99的重复条目,为什么需要随机选择一个呢?@ThePerplexedOne如果输入为98,值为99和97,则有两个最接近的值。很好@RufusLEvery time您按rnd订购。下一步,有人勒死了一只小狗。@JoelCoehoorn:有没有一种技术可以让你公平地生成一个随机排列?@JoelCoehoorn:你说了,但主要是,我的理解是由rnd进行排序。Next中彩票的几率很小,但仍然有可能没有完成或导致异常。你记错了。按随机值排序总是安全的。OrderBy相当于创建一个值数组和一个键数组,然后按键对值数组进行排序。你可能想的是,通过随机决定X是大于、等于还是小于Y的比较器来尝试洗牌总是错误的。@JoelCoehoorn:总是错误的原因是比较器需要遵循规则:X总是等于X,如果X小于Y,那么Y就大于X,决不能有及物性悖论;也就是说,如果X小于Y且Y小于Z,则X必须小于Z。随机比较器不符合此约定,并且可能导致排序算法以任意错误的方式失败。@EricLippert:new Guid返回00000000-0000-0000-0000-000000000000。我假定您指的是Guid.NewGuid。我不能这样做,因为在代码后面,我必须这样做:int indexWinner=Array.IndexOfscoreArray,nearestScore;仅供参考,您不需要减去1,因为maxValue参数是独占的,我认为您的意思是从列表中选择索引,而不是从scoreArray中选择索引。您可以通过使用返回列表[new Random.Nextlist.Count]替换最后3行来简化;更正了-1和“列表”-谢谢!我同意它可以简化,但为了清楚起见,我还是原封不动地离开了。就像我在编辑问题的底部一样。