hary Opublikowano 30 Sierpnia 2007 Zgłoś Opublikowano 30 Sierpnia 2007 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 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
tukamon Opublikowano 30 Sierpnia 2007 Zgłoś Opublikowano 30 Sierpnia 2007 Nie znam sie za bardzo na javie, ale chyba mozna zrobic tablice w ktorej sa wylosowane wyniki? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
hary Opublikowano 30 Sierpnia 2007 Zgłoś Opublikowano 30 Sierpnia 2007 no to przecie mam wyniki w tablicy, ale to nie o to tu chodzi ;] jak zrobić żeby w tej tablicy się nie powtarzały liczby? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
kfgz Opublikowano 30 Sierpnia 2007 Zgłoś Opublikowano 30 Sierpnia 2007 http://forum.purepc.pl/index.php?showtopic=232380 Co prawda C++ ale idea ta sama. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
hary Opublikowano 30 Sierpnia 2007 Zgłoś Opublikowano 30 Sierpnia 2007 (edytowane) 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 30 Sierpnia 2007 przez hary Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Polar Opublikowano 31 Sierpnia 2007 Zgłoś Opublikowano 31 Sierpnia 2007 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); Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
hary Opublikowano 31 Sierpnia 2007 Zgłoś Opublikowano 31 Sierpnia 2007 To je lux :D Wielkie dzięki razor1 :D Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
thuGG Opublikowano 31 Sierpnia 2007 Zgłoś Opublikowano 31 Sierpnia 2007 (edytowane) 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 31 Sierpnia 2007 przez thuGG Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Polar Opublikowano 31 Sierpnia 2007 Zgłoś Opublikowano 31 Sierpnia 2007 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. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
thuGG Opublikowano 31 Sierpnia 2007 Zgłoś Opublikowano 31 Sierpnia 2007 (edytowane) 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 31 Sierpnia 2007 przez thuGG Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 31 Sierpnia 2007 Zgłoś Opublikowano 31 Sierpnia 2007 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 :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
thuGG Opublikowano 2 Września 2007 Zgłoś Opublikowano 2 Września 2007 PelzaK, to do mnie tłumaczenie? Bo ja algorytm zaproponowany przez razor1 dobrze rozumiem;) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...