次の方法で共有


Vinderen af Xbox eliten.

Okay, så jeg har været ude på dybt vand før, og det er helt sikkert ikke sidste gang jeg prøver det. Dem der kender mig ved at jeg til tider kan være meget provokerende og det var bla. derfor jeg valgte at tage Mark's kode eksempel med - jeg vidste det ville gøre nogle af jer sure og jeg har faktisk også modtaget et par sure emails :)

Mark har ikke noget fjernsyn og har forøvrigt også adgang til en Xbox i Vedbæk, så han er altså ude af billedet.

Mit forsøg på at uddelegere "magten" har vist sig at være håbløs, så det skal jeg nok ikke gøre igen. Hvornår har det nogensinde været besværligt at vælge et tal fra 1 til 5 ? Jeg lader det ligge...

Jeg har ikke diskvalificeret Brian da jeg er synes de modeargumenterende kommentarer er flueknepperi og kan tyde på at flere af jer mangler at komme lidt mere ud end i plejer :)

Jeg valgte at tage de eksempler med jeg synes var unikke i et eller andet omfang, (dog lige på nær Dalagers eksempel), men jeg kan godt i se i bakspejlet at jeg måske var lidt for hurtig, og det må i undskylde. Jeg holder stadig fast i de 4 eksempler der allerede har været vist frem, men til dem vil jeg gerne tilføje yderligere et par stykker.

Lad os se dem alle sammen igen.

 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();
 }

Her ser vi Rasmus Kromann's PLINQ metode. Selv skriver Rasmus om denne metode:

Sjovt at PLINQ kan tæske LINQ med 300% på arrays af 4mil størrelse (på en quad-core), men en single-threaded algoritme så igen kan slå PLINQ med 400%. Tror dog stadig jeg foretrækker LINQ i det daglige.

Det er rart at se der allerede er nogen der benytter sig af parallel programming.

Et nyt eksempel jeg ikke havde med i forrige post er følgende. Metoden er skrevet af Tobias Michaelsen i JavaScript.

 function random_array() {
     var initial = [], result = [];
     for (var i = 1; i <= 1000; i++) initial.push(i);
     while (initial.length) result.push(initial.splice(Math.floor(Math.random() * initial.length), 1));
     return result;
 }

Det kommer altid bag på mig hvor meget lækker funktionalitet der ligger gemt i JavaScript, og læg også mærke til hvordan tingene er navngivet i sproget. Et nydeligt eksempel og særdeles nemt at læse og forstå - mere af den slags!

Jeg synes også Søren Larsen's VB eksempel er nydeligt. ja, faktisk er det det pæneste kode jeg har modtaget og det kommer lidt bag på mig da jeg normalt synes VB virker både kantet og fyldigt.

 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

Elegant løsning synes jeg bestemt det er. Og igen, meget nemt at læse sig ud af.

Brian's forsøg på at aflevere 1000 tal i tilfældig rækkefølge ser således ud.

 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 kan godt se meningen med funktionen, men pænt synes jeg bestemt ikke det er. Ja, det er kompakt men havde jeg ikke vidst hvad funktionen gjorde ville jeg ikke kunne give et hurtigt svar på det. Måske siger det noget om mine skills som udvikler, men jeg synes bestemt også det siger noget hvordan kode ikke bør se ud. Det er nemt at udtrykke sig advanceret i et sprog som C# men er det virkligheden bedre end at skrive 3-5 linier mere forståelig kode ?

Hvis vi skal se lidt nærmere på nogle andre sprog kan vi kigge på Joachim Lykke's forsøg i Boo:

 def ReturnRandomNumberArray():
   numbers = array(range(1,1001))
   random = Random()
   
   for i in range(0, 1000):  
     swapIndex = i + random.Next(numbers.Length - i)
     swapValue = numbers[swapIndex]
     numbers[swapIndex] = numbers[i]
     numbers[i] = swapValue
     
   return numbers

For mig ligner det en kombination af Ruby og Python, men jeg kan snildt tage fejl. Løsningensmodellen er ikke så forskellig fra mange af de andre eksempler men syntaksen er selvfølgelig anderledes.

I python har Jonas Larsen fået det til at se således ud:

 def nisseDans():
  import random, array
  nisser = range(0,1000)
  for i in nisser:
    snaps = random.randint(0,i)
    nisser[i], nisser[snaps] = nisser[snaps], nisser[i]
  return array.array("i", [nisse+1 for nisse in nisser])

Jeg synes det her kode ser anderledes ud end i de andre eksempler men det har nok noget at gøre med at jeg aldrig har fået lært Python og ikke kan gennemskue hvad der sker på de sidste 3 linier.

Det har været sjovt at se alle de forskellige måder dette problem kan løses på, men jeg kan kun se en vinder. Søren Larsen vinder sig en Xbox elite og Rasmus Kromann løber af med en anden præmie. Tillykke til jer. I vil modtage jeres præmier med posten i løbet af Januar måned. Email mig venligst jeres adresse.

Jeg har pakket alle eksemplerne ned i et C# projekt og det kan i downloade her.

God Jul!

Comments

  • Anonymous
    December 22, 2008
    Tillykke til Søren og Rasmus. Jeg syntes at det var skæg opgave og jeg må bukke mig ærbødigt i støvet for de mange af forslag der er blevet sendt ind. Jeg glæder mig allerede til næste år! ;-)

  • Anonymous
    December 22, 2008
    Også et tillykke til Søren og Rasmus herfra. Det har været en både sjov og lærerig række opgaver -- jeg ville bare ønske jeg havde set dem før de var overstået :) Bare lige for komplethedens skyld, kommer her en hurtig Ruby-version: def random_array(max)  values = (1..max).to_a  Array.new(max) { values.slice!(rand(values.length)) } end

  • Anonymous
    December 22, 2008
    Jamen jeg takker da mange gange. Det har været sjovt at være med, og det bliver ikke mindre sjovt af at vinde :-).