Gå til innhold

Anbefalte innlegg

Noen som har en? Jeg fant

private void Randomize<T>(ref List<T> list)
       {
           int count = list.Count;
           for (int i = 0; i < count; i++)
           {
               T tmp = list[i];
               list.RemoveAt(i);
               list.Insert(random.Next(count), tmp);
           }
       }

 

men virker ikke som den gjør noen særlig god jobb... listene den lager blir litt for lite tilfeldig... eller er det bare sånn det blir? Noen som kan se noe muffins med den?

Lenke til kommentar
Videoannonse
Annonse

Det er nok et tilfelle av en dårlig implementert Knuth shuffle dette her, dessverre. Blant annet bytter du posisjoner med elementer en allerede har stokket (en kan stokke med seg selv, imidlertid), noe som vil gi et skjevt resultat.

 

Dersom det er snakk om mange elementer, kan en også risikere at pseudotilfeldighetsgeneratoren simpelthen ikke har nok moduser til å muliggjøre alle premutasjoner. I så fall må man nok finne seg en bedre algoritme (her er noen i C#), eller anvende ekte tilfeldighet.

Lenke til kommentar

Nemlig.

 

Har justert den til

private List<T> Randomize<T>(List<T> list)
       {
           List<T> n = new List<T>(list.Count);

           for (int i = 0; i < list.Count; i++)
           {
               int r = random.Next(list.Count);
               n.Add(list[r]);
               list.RemoveAt(r);
           }
           return n;
       }

 

og ser ut til at den er litt bedre :) I hvert fall så holder det til mitt formål som er å stokke en liste med bilder. Fant dessuten en feil i koden min som gjorde at listen ble stokket først etter at jeg hadde vist det første bildet, noe som vil si at jeg alltid fikk det samme bildet først :p Ikke rart jeg synes det første bildet gikk litt igjen... tror kanskje det er på tide å legge seg :p

 

Men takk for svar!

 

Fant forøvrig også denne siden her som forklarte litt av det problemet du nevnte: http://www.boyet.com/Articles/SimpleShuffling.html

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...