Avatar billede the_raze Nybegynder
17. oktober 2004 - 13:08 Der er 11 kommentarer og
1 løsning

Random IKKE ENS tal..

Hejsa!

Jeg har siddet lidt og rodet med rand() og det går i og for sig godt nok.. Mit problem er bare, at jeg vil gerne have tilfældige tal mellem 1 og 10 som skal smides ind i et array der er 10 langt.. Problemet er bare, at disse tal IKKE må være ens..

Jeg kan ikke helt gennemskue hvordan jeg undersøger dette?!

På forhånd tak!
Avatar billede hepou Nybegynder
17. oktober 2004 - 13:13 #1
Kan du ikke bare tjekke på om tallet allerede findes i arrayet med en if-sætning?
Avatar billede the_raze Nybegynder
17. oktober 2004 - 13:19 #2
Man kan ikke bare gøre det med

int a[10];

bla bla bla

random = rand() bla bla bla

if(random == a)
{
  dont add to array
} else {
  add to array
}

?
Avatar billede hepou Nybegynder
17. oktober 2004 - 13:25 #3
du skulle måske lige lave en løkke der kører hele arrayet igennem.

for(int i=0; i<10; i++)
{
  int a[10];
  int random = rand();

  if(a[i] == random)
  {
    dont add to array
  }
  else
  {
    add to array
  }
}
Avatar billede the_raze Nybegynder
17. oktober 2004 - 13:31 #4
sådan havde jeg også gjort det først, men den tjekker da ikk de tidligere værdier vel? Men kun den aktuelle plads? og jeg vil slet ikk have at værdierne er ens i hele arrayet..

dvs
5 3 8 9 2 6 1 4 7 10
er OK

det er den her IKKE
5 5 2 3 4 7 6 9 1 3
Avatar billede arne_v Ekspert
17. oktober 2004 - 13:33 #5
Prøv noget a la:

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

bool already(int v, int *a, int n)
{
  for(int i=0;i<n;i++)
  {
      if(v==a[i]) return true;
  }
  return false;
}

int main()
{
  srand(time(NULL));
  int a[10];
  for(int i=0;i<10;i++)
  {
      do
      {
        a[i] = rand() % 10 + 1;
      }
      while(already(a[i],a,i));
  }
  for(int i=0;i<10;i++)
  {
      cout << a[i] << endl;
  }
  return 0;
}
Avatar billede bertelbrander Novice
17. oktober 2004 - 13:55 #6
#include <iostream>
#include <vector>
#include <algorithm>
#include <stdlib.h>
#include <time.h>

class RandomClass
{
public:
  RandomClass()
  {
      srand(time(0));
  }

  int operator()(int aRange)
  {
      return int(1.0*aRange*rand()/RAND_MAX);
  }
};

int main()
{
  std::vector<int> Vector;
  int a;
  for(a = 1; a <= 10; a++)
      Vector.push_back(a);

  RandomClass Rand;

  std::random_shuffle(Vector.begin(), Vector.end(), Rand);

  for(a = 0; a < 10; a++)
      std::cout << Vector[a] << std::endl;

  return 0;
}
Avatar billede the_raze Nybegynder
17. oktober 2004 - 14:07 #7
Undskyld.. Min fejl! Programmet skal være i ANSI C..

Jeg har ændret lidt på det, til følgende:

#include<stdlib.h>
#include<stdio.h>
#include<time.h>

int i;

int a[10];

int already(int v, int *a, int n)
{
  for(i=0;i<n;i++)
  {
      if(v==a[i]) return 1;
  }
  return 0;
}

void main()
{
  srand(time(NULL));
 
  for(i=0;i<10;i++)
  {
    do
    {
    a[i] = rand() % 10 + 1;
    }

    while(already(a[i],a,i) == 0);
  }

  for(i=0;i<10;i++)
  {
      printf("%d", a[i]);
  }

}

Men jeg må have gjort noget forkert, for det bringer mig bare i en uendelig løkke.. Nogen der har et forslag?
Avatar billede arne_v Ekspert
17. oktober 2004 - 14:09 #8
Skal

while(already(a[i],a,i) == 0);

ikke være

while(already(a[i],a,i) != 0);
Avatar billede arne_v Ekspert
17. oktober 2004 - 14:11 #9
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int already(int v, int *a, int n)
{
  int i;
  for(i=0;i<n;i++)
  {
      if(v==a[i]) return 1;
  }
  return 0;
}

int main()
{
  int i,a[10];
  srand(time(NULL));
  for(i=0;i<10;i++)
  {
      do
      {
        a[i] = rand() % 10 + 1;
      }
      while(already(a[i],a,i));
  }
  for(i=0;i<10;i++)
  {
      printf("%d\n",a[i]);
  }
  return 0;
}
Avatar billede the_raze Nybegynder
17. oktober 2004 - 14:15 #10
Duh! Jo, selvfølgelig skal den det..

Tak for hjælpen, smid et svar! :)
Avatar billede arne_v Ekspert
17. oktober 2004 - 14:39 #11
ok
Avatar billede arne_v Ekspert
06. november 2004 - 18:26 #12
Så mangler du bare at acceptere svaret
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester