Skocz do zawartości
hary

[java] Random()

Rekomendowane odpowiedzi

Potrzebuje wylosować x z y dostępnych liczb całkowitych, losuje używając nextInt(y), jednak liczby nie mogą się powtarzać, ma ktoś może jakąś koncepcje jak to rozwiązać? O ile jak losuje kilka z kilkudziesięciu to się nie powtarzają często, ale jak 3 z 4 na przykład to już lipa :P

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

O tym mówisz?

 

#pragma argsused#pragma hdrstop#include<stdlib.h>#include<conio.h>#include<stdio.h>#include<time.h>int tab[10];int i, k;time_t random_generator;int main() {tab[0] = rand()%15;for(k = 1; k < 10; k++) {tab[k] = rand()%15;for(i = k - 1; i >= 0; i--)   if(tab[k]==tab[i]) tab[k] = rand()%15;}for(k = 0; k < 10; k++) printf("%d %d\n", k, tab[k]);getch();return 0;}

Już dzisiaj pisałem coś podobnego, chyba, o tej godzinie juz mi się ciężko mysli, w każdym razie mi sprawdzało ze wszystkimi wylosowanymi poprzednio, ale nie sprawdzało s powrotem z tą co wylosowało jeśli się już powtórzyła.

 

Czyli jak mi za 3 i za 1 razem wylosowało na przykład 2 to losowało jeszcze raz, ale jeśli jeszcze raz wylosowało 2 to już to nie było kontorlowane.

Edytowane przez hary

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

IMO bez sensu ten kod. W Javie najlepiej użyć jakiś kolekcji dynamicznych do tego celu typu vector, linkedlist itd.

Przykładowy kod, pisany na szybko bez kontroli błędów itp.

 

import java.util.*;public class Main {	public static void main(String[] args) 	{		Main m = new Main();		int [] tab = new int[15];		m.Losowanie(tab, 0, 15);  //tutaj jest pod pewnym warunkiem		for(int i = 0; i < tab.length; i++)			System.out.println(tab[i]);	}	public void Losowanie(int [] tab, int od, int doo)	{		Vector<Integer> v = new Vector();		Random rand = new Random();		for(int i = od; i < doo; i++)  			v.add(i);		for(int j = 0; j < tab.length; j++)  			 tab[j] = v.remove(rand.nextInt(v.size()));	}}

Jest tylko jeden warunek w metodzie Losowanie() parametry od i doo muszą spełniać taki warunek: doo-od >= rozmiar tablicy, ale to jest logiczne.

 

int [] tab = new int[15];//żeby mieć 15 liczb z przedzialu [0,14]m.Losowanie(tab, 0, tab.length);//żeby mieć 15 liczb z przedziału [100, 199]m.Losowanie(tab, 100, 200);

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

import java.util.HashSet;import java.util.Random;import java.util.Set;public class Main {		public static void main(String[] args) {		Set<Integer> set = new HashSet<Integer>();	//Zbior, w którym trzymamy wylosowane liczby	int ile = 15;			//Ilosc liczb do wylosowania	int max = 50;			//Wielkosc zbioru z jakiego bedziemy losowac		Random rand = new Random();		//Losowanie liczb	while (set.size() < ile) {		set.add(new Integer(rand.nextInt(max)));	}		//Wypisanie wylosowanych liczb	for(Integer i : set) {		System.out.print(i + " ");	}		}	}

 

Troche prostsze, wykorzystujemy tutaj fakt, że kolekcja Set nie może zawierac powtarzających się wartości, więc jesli zostanie wylosowana druga taka sama liczba, to po prostu nie zostanie dodana do Seta. Losujemy dopóki Set nie bedzie miał porządanej liczby elementów.

 

 

BTW razor1, nazwy metod rozpoczynamy z małej litery.

Edytowane przez thuGG

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

To też sposób, ale nieoptymalny. Trzeba zauważyć że w przypadku pesymistycznym czas działania tego rozwiązania będzie równy nieskończoność. Bo losowe liczby mogą być takie same jakie już są i będzie tak sobie losować i losować... Optymistyczny może być liniowy, trafi za pierwszym razem każdy element, co jest praktycznie niemożliwe.

 

To co podałem jest w każdym wariancie liniowe: pesymistycznym, optymistycznym i średnim. Czas działania zależy tylko od liczby elementów. Wartość wylosowanego elementu nie ma żadnego wpływu na szybkość działania, bo nawet nie jest sprawdzana.

 

Ja pisze klasycznie obiektowo <zmienna, Metoda, Klasa, dlugaNazwa> kwestia przyzwyczajenia.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No tak, masz racje, twój algorytm jest lepszy. Z tym, że Vector można by zastąpić ArrayList, która będzie szybsza jesli z kolekcji ma korzystac tylko jeden wątek. Ale to tylko takie przekomarzanie.

 

Co do nazw, cóż konwencja w Javie jest taka ze nazwy metod piszemy z małej litery i mysle, ze nalezałoby sie jej trzymac, chocby po to zeby nie wprowadzac w błąd początkujących.

Edytowane przez thuGG

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

podchodząc do problemu najlepiej wyobraź sobie jak to działa w świecie rzeczywistym...

 

Masz zbiór kulek (vector liczb) i losujesz z niego 7 kulek, ale tak zeby sie nie powtarzały, wiec wyciągasz po prostu te kulki wylosowane (usuwasz wylosowane liczby z vectora), za kazdym razem losujesz oczywiscie z mniejszej puli :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.



×
×
  • Dodaj nową pozycję...