Vinderen af XBoxen

Jeg gør dette kort fordi jeg gerne vil holde weekend!

Sagen er den at jeg har fået rigtig mange gode bud på opgaven fra igår. Men der er et bud der slår dem alle sammen. Desværre kommer budet fra en Microsoft ansat, og da det ikke er første gang andre har fået ondt i deres jantelov, så må jeg hellere lade være med at give ham den Xbox. Mark du har ellers fortjent den!

Mark Seemann indsendte som en af de første dette knivskarpe bud:

 Random r = new Random();
 int[] numbers = Enumerable.Range(1, 1000).
     Select(i => new { I = i, Key = r.Next() }).
     OrderBy(a => a.Key).
     Select(a => a.I).ToArray();

Men den går som sagt ikke...med mindre i andre synes at han skal vinde ?

Lad os se på hvad der ellers ligger i bunken.

Søren Larsen kom med et bud i VB.NET:

 Function ArrayOfInts() As Integer()
         Dim ArrayItems As New List(Of KeyValuePair(Of Integer, Integer))
         Randomize()
         For C = 1 To 1000
             ArrayItems.Add(New KeyValuePair(Of Integer, Integer)(Rnd() * 20000, C))
         Next
         Return (From entity In ArrayItems Order By entity.Key Select entity.Value).ToArray
 End Function

Og Brian har selvfølgelig også været på banen med dette:

 public static int[] GetRandomNumbers() {
    var numbers = Enumerable.Range(1, 1000).ToList();
    var random = new Random();
    numbers.Sort((l, r) => l == r ? 0 : random.Next(3) - 1 );
    return numbers.ToArray();
 }

Jeg har faktisk modtaget rigtig mange forslag der stort er ens. Se f.eks dette eksempel af Christian Dalager:

 public List<int> Get1000Ints()
 {
     const int max = 1000;
     var result = new List<int>(max);
     var rand = new Random();
  
     var intSrc = Enumerable.Range(1, 1000).ToList();
  
     for (var i = max - 1; i >= 0; i--)
     {
         var index = i == 0 ? 0 : rand.Next(i - 1);
         result.Add(intSrc[index]);
         intSrc.RemoveAt(index);
     }
     return result;
 }

Den sidste jeg vil bede jer om at tage med op til overvejelse er følgende:

 public static int[] GenerateUsingHybridLinq(int arrayLength)
 {
     var random = new Random();
  
     // Use PLINQ if we're above the "very scientific" limit of 3000.
     if(arrayLength >= 3000)
     {
         return (from i in ParallelEnumerable.Range(1, arrayLength)
                 orderby random.Next()
                 select i).ToArray();
     }
  
     return (from i in Enumerable.Range(1, arrayLength)
             orderby random.Next()
             select i).ToArray();
 }

I har indtil Mandag til at stemme på disse forslag. Der er i alt 5 kode eksempler, og i skal bare skrive jeres navn og tallet fra 1 - 5! I må kun stemme en gang.

Xboxen bliver sendt ud efter jul!