Wątek przeniesiony 2015-11-12 15:45 z C/C++ przez ŁF.

losowanie bez powtórzeń

0

Witam!
Nie mogę ni jak ogarnąć losowania bez powtórzeń...
kod:

 // calculator.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"
#include <iostream>
#include <string>
#include <cstdlib>
#include <cmath>
#include <ctime>


int array[5];
bool repeat = true;


int _tmain(int argc, _TCHAR* argv[])
{
	
	std::cout << "hello!" << std::endl;
	srand(time_t(NULL));
	for (int i = 0; i < 6; ++i){
		array[i] = rand() % 100;
		for (int j = 0; j < i; j++){
			while (repeat){
				if (array[j] == array[i]){
					array[i] = rand() % 100;
					repeat = true;
				}
			
			}
			
		}
		
	}

	// show
	for (int i = 0; i < 6; i++) std::cout << array[i] << "\t";





	std::cin.sync();
	std::cin.get();
	return 0;

}

Albo wyświetla się z powtórzeniami, albo wcale się nie wykonuje ...

4

Ogółem, jeśli zakres liczb jest niewielki dla komputera to lepiej jest wpakować wszystkie wartości do wektora, wymieszać go, a potem po prostu wziąć kilka pierwszych elementów.

Np. dziesięć losowych liczb z zakresu [101,150] bez powtórzeń:

	vector<int> vec(50);
	iota(vec.begin(), vec.end(), 101);
	shuffle(vec.begin(), vec.end(), std::random_device{});
	vector<int> bez_powtorzen(vec.begin(), vec.begin() + 10);

http://melpon.org/wandbox/permlink/VfwHtgaXtjk6TNd7

Odnośnie Twojego kodu:

  1. używanie rand jest niezalecane: https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful
  2. niepoprawnie sprawdzasz czy już wylosowałeś liczbę. Powinieneś sprawdzić wszystkie wylosowane indeksy (od 0 do i-1) czy już ta liczba nie występuje. Przy czym to dość powolne.
0

Dzięki śliczne na szybką odpowiedź!

Pozdrawiam! :)

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