Slumpa ut unika tal i en array med hjälp av for-loop
Hej.
Jag sitter i C# och försöker att skapa slump-generator som ska slumpa ut 5 tal (1-25) som ska sparas i en array. Talen i array:n måste dock vara unika och man får enbart använda sig av loopar för att klara detta. Jag har en kod som jag undrar varför den inte funkar, tänkte höra om ni hade några tips på vad som gått fel.
// Skapar ny vektor för de slumpade talen
int[] slumpadeTal = new int[5];
Random slumpare = new Random();
for (int i = 0; i < slumpadeTal.Length; i++)
{
slumpadeTal[i] = slumpare.Next(1, 26);
for (int j = 0; j < slumpadeTal.Length; j++)
{
if (slumpadeTal[i] == slumpadeTal[j])
{
slumpadeTal[i] = slumpare.Next(1, 26);
continue;
}
}
}
Är inte jättehaj på hur random fungerar så jag antar att det kan vara nåt fel där jag gjort, vi fick koden av läraren då han sa att vi inte behövde förstå den helt riktigt ännu.
Meningen med min kod var att den skulle slumpa ut ett tal och om talet redan funnits så skulle den slumpa ut ett nytt tal och köra om den nästlade loopen.
Berätta gärna om vad som blir fel.
Jag har en annan kod som printar ut de 5 talen från array:n och det blir fortfarande samma tal i den ibland (alltså inte unika tal).
Jag tror detta kan vara ett stort fel också:
if (slumpadeTal[i] == slumpadeTal[j])
har suttit lite och experimenterat med den i en annan kod och inte fått det att funka.
Anledningen till att jag använde en nästlad ny loop var att jag fick det att funka för en kod som skulle jämföra en om en array hade något samma värde från en annan array, men här använder vi alltså bara en array, kan det vara det som är felet?
Om arr[i]=5, och i är 3, ich vi checkar med j, låt säga nu att elemtn 0 är också 5, vi kommer då få att arr[i]=arr[j], vilket stämmer, misstaget är att vi nu slumpar arr[i], men vad händer om vi nu råkar slumpa 5 igen? Då är ju både arr[j] och arr[i] 5 och vi går vidare. Detta gör att det alltid finns en risk att du slumpar dubbletter. Det är därför du ibland får 5 unika tal oxh ibland inte. Problemrt är alltså i hur du hanterar dubbletter, dvs din if sats men for loopen som följd blir fel.
Edit: Skrev fel här.
Förstår vad du menar, ska kolla på det, men det borde vara rätt liten chans att det blir en dubblett eftersom det först måste bli en dubblett och sen randomar om igen och måste bli det igen, känns mer som att koden inte ens funkar.
Lite pseudokod (jag har inte tittat på din kod):
Förbered lagringsplats för dina tal.
Gör nedanstående tills du har lagrat fem tal:
a: Slumpa fram ett tal
Kolla om talet redan är lagrat:
om det är det så gå tillbaka till a
om det inte är det, så lagra talet
Laguna skrev:Lite pseudokod (jag har inte tittat på din kod):
Förbered lagringsplats för dina tal.
Gör nedanstående tills du har lagrat fem tal:
a: Slumpa fram ett tal
Kolla om talet redan är lagrat:
om det är det så gå tillbaka till a
om det inte är det, så lagra talet
Det är nog: "Kolla om talet redan är lagrat:"
Som jag kört fast på. Tänker du for-loop som kollar värdena i array:n?
Jag tänkte intd alls, men så kan du göra.
Det var så jag försökte lösa det i koden men vet inte riktigt varför det blir fel.
Jag testade koden lite mer, testade lägga en Console.WriteLine("Test"); istället för ny random i
if (slumpadeTal[i] == slumpadeTal[j])
och den körde den varje iteration, så det är helt klart något med den koden som inte funkar alls.
Laguna skrev:Lite pseudokod (jag har inte tittat på din kod):
Förbered lagringsplats för dina tal.
Gör nedanstående tills du har lagrat fem tal:
a: Slumpa fram ett tal
Kolla om talet redan är lagrat:
om det är det så gå tillbaka till a
om det inte är det, så lagra talet
Jag hade gjort likadant. Om det uppkommer dubblett så kör man den yttre loopen igen bara genom att minska i.
Sedan behöver du inte gå igenom hela arrayen, det är onödigt och tar upp resurser. Nu bryr man sig förmodligen inte om optimerad kod på denna nivån men det kan vara bra att optimera sin kod så mycket som möjligt ändå. Du behöver bara kolla alla element som ligger till vänster om i, dvs du ska inte loopa från j<arr.length utan j<i.
Dracaena skrev:Laguna skrev:Lite pseudokod (jag har inte tittat på din kod):
Förbered lagringsplats för dina tal.
Gör nedanstående tills du har lagrat fem tal:
a: Slumpa fram ett tal
Kolla om talet redan är lagrat:
om det är det så gå tillbaka till a
om det inte är det, så lagra talet
Jag hade gjort likadant. Om det uppkommer dubblett så kör man den yttre loopen igen bara genom att minska i.
Sedan behöver du inte gå igenom hela arrayen, det är onödigt och tar upp resurser. Nu bryr man sig förmodligen inte om optimerad kod på denna nivån men det kan vara bra att optimera sin kod så mycket som möjligt ändå. Du behöver bara kolla alla element som ligger till vänster om i, dvs du ska inte loopa från j<arr.length utan j<i.
Vill ni ge lite exempel på kod hur man kolla upp värdena i en array och jämföra dem med andra värden?
Suttit och mekat med det, det verkar funka nu. Tack för hjälpen Dracaena och Laguna!