Wykluczenie powtórzeń liczb w programie losującym

0

Stworzyłem taki program losujący, coś na podobieństwo losowania totka 6 z 49 liczba,poniżej program.
Lecz nie wiem jak mogę zrobić aby liczby podczas losowania nie moógłby się powtarzać.
I jeszcze jedno czy taki sposób ze wskaźnikiem jest dobry czy lepiej dać tablica[i] = rand() % 49 + 1 ? , kiedy program będzie szybszy ?

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <Windows.h>
using namespace std;

int main()
{
	int tablica[6];
	int *wsk = tablica;
	cout << "Program losujacy 6 z 49 liczba\n\n";

	srand(time(NULL));

	for(int i = 0; i < 6; i++, wsk++)
	{
		*wsk = rand() % 49 + 1;
		Sleep(1000);
		cout << *wsk << endl;
	}

	system("pause");


} 
4

std::shufle - możesz zaimplementować ten sam algorytm samodzielnie.
Na tym forum podawałem rozwiązania w C oraz C++ - wystarczy poszukać.

1
nowicjusz35 napisał(a):

Lecz nie wiem jak mogę zrobić aby liczby podczas losowania nie moógłby się powtarzać.

było dosłownie setki razy - poszukaj
albo musisz porównać czy liczba już istnieje w wylosowanych, albo wrzucić do tablicy wszystkie liczby, przetasować i wybrać 6

kiedy program będzie szybszy ?

jak wyrzucisz sleepa
program będzie tak samo szybki bo to to samo

tablica[i]

jest równoważny

*(tablica+i)

0

Jeszcze mam jedno pytanie bo ten program pisałem z pomocą internetu i jest linijka:

srand(time(NULL))

Czy mogę jakoś to inaczej ustawić, zamiast time dać jakieś liczby, tylko jak ?

0

srand(1000);

1

jako parametr podajesz ziarno - jeżeli podasz tam jakąś stałą liczbę to zawsze dostaniesz te same wyniki losowań przy każdym uruchomieniu programu

czas jest powszechnie wykorzystywany jako zmieniająca się wartość, ale równie dobrze możesz tam podać wartość z czujnika temperatury, współrzędne gps, czy cokolwiek
w takim na przykład truecrypcie user jest proszony o losowe ruszanie myszką żeby zwiększyć "losowość" klucza

jednak użycie czasu powinno Ci w zupełności wystarczyć

0

Mógłby ktoś powiedzieć co w moim kodzie jest nie tak, bo powtarzają się liczby, dzięki :

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <Windows.h>
using namespace std;
 
bool Powtorka(int liczba, int tab[], int ile);
//************************************************************************
int main()
{
    int tablica[6], losy = 5;

    cout << "Program losujacy 6 z 49 liczba\n\n";
 
    srand(time(NULL));
 
    for(losy = 0; losy < 6; )
    {
        int liczba = rand() % 49 + 1;
		if(Powtorka(liczba,tablica,losy) == false)
		{
			tablica[losy] = liczba;
			losy++;
		}
		Sleep(1000);
        cout << liczba << endl;
    }
 
    system("pause");
 
 
} 
//************************************************************************
bool Powtorka(int liczba, int tab[], int ile)
{
	for(int i = 0; i < ile; i++)
	{
		if(tab[i] == liczba)  return true;
	}

	return false;
} 
1

losy ma wartość 5 i idzie w górę, więc losujesz tylko jeden raz i ustawiasz wartość na samym końcu.

Do tego odczytujesz tablicę tablica bez jej uprzedniego zainicjalizowania - to jest UB.</del>

Nie umiem czytać.

Zmienna losy przekazana do funkcji Powtorka powinna być zwiększona o jeden. W obecny sposób nie sprawdzasz ostatniej wartości tablicy.

0

@kq nie jest od 5 bo jest zerowana w for

0
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
void Rand49(int tab[],size_t count)
  {
   int tb[49];
   for(size_t i=0;i<49;++i) tb[i]=i+1;
   for(size_t i=0;i<count;++i)
     {
      size_t p=i+rand()%(49-i); // może warto użyć generatora z C++11
      tab[i]=tb[p];
      tb[p]=tb[i];
     }
  }

int main()
  {
   int tablica[6];
   srand(time(0));
   
   Rand49(tablica,6);
   for(size_t i=0;i<6;++i) cout<<tablica[i]<<' ';
   cout<<endl;

   cin.get(); // jeżeli potrzebujesz tego to zmień IDE na jakieś z tego tysiąclecia
   return 0;
  }

http://ideone.com/JdkGjU

0

A co w swoim programie mogę poprawić aby zaczął działać poprawnie, bo nie mogę doszukać się błędu ? Dzięki.

0

ale po co mi ten program ? Ja przecież nie porównuje dwóch plików tekstowych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1