12 svar
569 visningar
OsantOsmart är nöjd med hjälpen
OsantOsmart 16
Postad: 11 aug 2021 15:48 Redigerad: 11 aug 2021 16:02

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.

Fermatrix 7841 – Fd. Medlem
Postad: 11 aug 2021 16:17

Berätta gärna om vad som blir fel.

OsantOsmart 16
Postad: 11 aug 2021 16:19 Redigerad: 11 aug 2021 16:22

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?

Fermatrix 7841 – Fd. Medlem
Postad: 11 aug 2021 16:42

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. 

OsantOsmart 16
Postad: 11 aug 2021 16:42 Redigerad: 11 aug 2021 16:57

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.

Laguna Online 28591
Postad: 11 aug 2021 16:57

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

OsantOsmart 16
Postad: 11 aug 2021 17:00
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?

Laguna Online 28591
Postad: 11 aug 2021 17:01

Jag tänkte intd alls, men så kan du göra.

OsantOsmart 16
Postad: 11 aug 2021 17:04

Det var så jag försökte lösa det i koden men vet inte riktigt varför det blir fel.

OsantOsmart 16
Postad: 11 aug 2021 17:09

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.

Fermatrix 7841 – Fd. Medlem
Postad: 11 aug 2021 17:23
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.

OsantOsmart 16
Postad: 11 aug 2021 17:40
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?

OsantOsmart 16
Postad: 11 aug 2021 18:15

Suttit och mekat med det, det verkar funka nu. Tack för hjälpen Dracaena och Laguna!

Svara Avbryt
Close