webForumDet fria alternativet

Slumpa 20 st unika tal emellan ett intervall

C/C++

7 svar · 1 511 visningar · startad av Addeladde

Medlem sedan jan. 20013 406 inlägg
Frågan#1

Hur gör jag för att slupma 20 st unika tal?
HAr försökt med detta men det går inte så bra.

srand( time( NULL ) );

  for(i=0; i<20; i++)
  {

    unik=0;
    do
    {

      slumptal[i] = rand() % (Slut-Start)+Start;
      for(j=0; j<21; j++)
      {
        if(slumptal[i]==slumptal[j])
        {
          unik=1;
        }
      }

    }while(!(unik==0));

  }

:)

Medlem sedan maj 20021 466 inlägg
#2

"for(j=0; j<21; j++)"
21 borde vara 20 om du vill gå igenom alla. Fast du bör inte gå igenom de tal som inte är slumpade. Använd därför i istället för 21.

unik-variabeln är dessutom logiskt fel. Du utgår från att om unik=1, är talet inte unikt. Det borde vara tvärtom.

Medlem sedan jan. 20013 406 inlägg
#3

Fungerar ändå inte?
Det blir samma tal på flera av de 20 om jag sätter intervallet mellan 100-120

Medlem sedan dec. 20025 483 inlägg
#4
	srand( time(NULL) );
	
	std::vector<unsigned short> v;
	unsigned short n = 0;
	
	while (n != 20) {
		re:
		unsigned short num = rand() % 20 + 100;
		
		for (unsigned short i = 0; i < v.size(); ++i)
			if (num == v[i]) goto re;
		
		v.push_back(num);
		++n;
	}
	
	for (unsigned short i = 0; i < v.size(); ++i)
		std::cout << v[i] << std::endl;

:)

Medlem sedan jan. 20013 406 inlägg
#5

Skulle man kunna få en förklaring? Jag läser nämligen en kurs och försöker lära mig C. Finns det inget sätt man kan få min egen kod att fungera?

Medlem sedan maj 20021 466 inlägg
#6

Jag hittade två fel i koden utan att testköra den. Nu har jag hittat ett till. Om unik sätts till 1 kommer programmet att fastna i en oändlig loop. Ändra "unik=0; do {" till "do { unik=0;". Försök att hitta resten själv. :)

Det väldigt dumt att slumpa 20 unika tal mellan 1 och 20. Då innebär det att datorn till slut måste gissa sig fram till vilka tal som är lediga och det kan ta väldigt lång tid (oändlig tid om du har otur). Du har två alternativ här. Du kan antingen öka intervallet eller lägga alla giltiga tal i en separat lista där du plockar bort de tal som är ogiltiga/tagna.

--

Efter att jag skrivit mitt inlägg såg jag inlägget av Peter S. Det innehåller goto, som bara ska användas i undantagsfall. Bort med det!

Medlem sedan jan. 20013 406 inlägg
#7

Anledningen till att jag vill slumpa 20 tal inom ett intevall mellan 1 till 20 är för att testa om mit program verkligen slumpar unika tal. Sedan ska jag öka intervallet.

Får dessutom inte använda goto på min kurs.

Medlem sedan jan. 20013 406 inlägg
#8

Gjorde så här och då fungerar det.

for(i=0; i<20; i++)
  {

    do
    {
      ejUnik=0;

      /*Första värdet anger intervall andra värdet anger start.*/
      vinster[i] = rand() % 20 + 100;
      for(j=0; j<i; j++)
      {
        if(vinster[i]==vinster[j])
        {
          ejUnik=1;
        }
      }
    }while(ejUnik==1);

  }
258 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
130 ms — deklarationer (db)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)