list random doorlopen

  • Onderwerp starter Onderwerp starter baws
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

baws

Terugkerende gebruiker
Lid geworden
9 apr 2010
Berichten
1.258
Hallo,

Ik ben op zoek naar een simpele manier om door alle items uit een list te gaan op random volgorde.
dus niet dat het steeeds 3--5--1-2--4 is bijvoorbeeld maar steeds de volgorde veranderd.
Ik heb al via google veel oplossingen gevonden maar die zijn heel lang, weet iemand een simpele manier?
 
Lang? je zult altijd wat code moeten schrijven. Als je de data hebt uitgeschreven in een array kun je een tweede array maken en random uit de originele array trekken 1 voor 1. De items komen dan in de tweede array in willekeurige volgorde.

In principe werkt het ook met LIST en MAP e.d.
 
het is de bedoeling voor een list
private List<Track> tracks;
 
Even uit de losse pols (heb geen VS). Nieuwe lijst uiteraard zelfde type als oude lijst. mogelijk bevat het typefoutjes e.d. maar zoiets kan het worden.

Code:
int a;
Random rand = new Random();
list<Track> nlijst = new list<Track>;
while oudelijst.count()
{
a=rand.next(oudelijst.count());
nlijst.add(oudelijst[a]);
oudelijst.removeat(a);
}
 
Hier wordt a niet verhoogd?
de loop werkt niet, foutmelding

Error 1 'System.Collections.Generic.List<AudioDevices.Tracks.Track>' does not contain a definition for 'count' and no extension method 'count' accepting a first argument of type 'System.Collections.Generic.List<AudioDevices.Tracks.Track>' could be found (are you missing a using directive or an assembly reference?) C:\Users\Ik\Documents\Visual Studio
2012\Projects\AudioDevices\AudioDevices\TrackList.cs 95 22 AudioDevices

ik heb nog nooit een while loop gemaakt met als voorwaarde count.
wordt de loop dan gewoon uitgevoerd zolang er geteld wordt en bij elke waarde de code tussen {} uitgevoerd?
oudelijst.removeat(a);
dan wordt toch het orgineel verwijderd? wat niet de bedoeling is.
 
Laatst bewerkt:
Je maakt toch een kopie eerst (zie je andere topic, met de gecopieerde lijst kun je dit gewoon doen)

Klein foutje in dat count een directe int is niet een method.:

Code:
private void button1_Click(object sender, EventArgs e)
        {
            List<int> henk = new List<int>();
            List<int> jan = new List<int>();
            Random rand = new Random();
            int a;

            henk.Add(1);
            henk.Add(2);
            henk.Add(3);
            while (henk.Count > 0)
            {
                a=rand.Next(henk.Count);
                jan.Add(henk[a]);
                henk.RemoveAt(a);
            }
            foreach (int b in jan)
            {
                MessageBox.Show(Convert.ToString(b));
            }
        }

testcode die ik zelf even heb geschreven
 
Hoi,

Ik beaam wat kenika zegt.
De makkelijkste manier is een tijdelijke lijst van je Track-objecten maken, deze willekeurig er uit te halen en in een nieuwe lijst met Track-objecten te plaatsen.
Bovenstaand voorbeeld kan niet korter.

Groetjes,
 
Haha, nou, vooruit. De logica kan niet korter. Met lambda-notatie kun je inderdaad regels wegwerken. ;)
 
nog een vraagje

Code:
private void button1_Click(object sender, EventArgs e)
        {
            List<int> henk = new List<int>();
            List<int> jan = new List<int>();
            Random rand = new Random();
            int a;

            henk.Add(1);
            henk.Add(2);
            henk.Add(3);
            while (henk.Count > 0)
            {
                a=rand.Next(henk.Count);
                jan.Add(henk[a]);
                henk.RemoveAt(a);
            }
            foreach (int b in jan)
            {
                MessageBox.Show(Convert.ToString(b));
            }
        }

is hier henk of jan het orgineeel?
als henk het orgineel is waarom wordt dan henk verwijderd.
als jan het origineel is waarom wordt er dan een waarde toegevoegd? bij jan.Add(henk[a]);
en waar staat int b voor in de foreach loop?
ik heb nu

Code:
public void shuffle()
        {
            Console.WriteLine();
            Console.WriteLine("Shuffle");
            List < Track > kopie = new List<Track>(tracks); //de list "tracks" wordt gekopieerd in de nieuwe list "kopie"

            Console.WriteLine("Kopie testen");
            for (int i = 0; i < kopie.Count; i++)           // de list "kopie" testen of hij goed is overgezet.
            {
                string tijd = kopie[i].GetLength();
                Console.WriteLine(kopie[i].Artist + " - " + kopie[i].Name + "-" + tijd);
            }

            
            Random rand = new Random();
            int a;

            
            while (tracks.Count > 0)
            {
                a = rand.Next(tracks.Count);
               kopie.Add(tracks[a]);
                tracks.RemoveAt(a);
            }
            Console.WriteLine("Shuffle");
            for (int i = 0; i < kopie.Count; i++)           // de list "kopie" testen of hij goed is overgezet.
            {
                string tijd = kopie[i].GetLength();
                Console.WriteLine(kopie[i].Artist + " - " + kopie[i].Name + "-" + tijd);
            }

hier krijg ik eerst de orginele lijst na de laatste Console.WriteLine("Shuffle"); en daarna de geschuffelde lijst.
maar waarom krijg ik dan eerst de orginele lijst?
 
Laatst bewerkt:
Ik heb het aangepast en heb nu

Code:
public void shuffle()
        {
            Console.WriteLine();
            Console.WriteLine("Shuffle");
            List < Track > kopie = new List<Track>(); //de list "kopie" wordt aangemaakt.   
            List<Track> kopie2 = new List<Track>(tracks);
            Random rand = new Random();
            int a;            
            while (kopie2.Count > 0) 
            {
                a = rand.Next(kopie2.Count);
               kopie.Add(kopie2[a]);
              kopie2.RemoveAt(a);
            }

           
            for (int i = 0; i < kopie.Count; i++)           // de list "kopie" testen of hij goed is overgezet.
            {
                string tijd = kopie[i].GetLength();
                Console.WriteLine(kopie[i].Artist + " - " + kopie[i].Name + "-" + tijd);
                
            }

        
            

        }

hij shuffelt het nu wel maar als ik de shuffle 3 x achter elkaar uitvoer in mijn program.cs met trackList.shuffle(); krijg ik 3 keer dezelfde geschuffelde lijst
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan