losowanie bez powtórzeń

Odpowiedz Nowy wątek
2015-01-05 19:25
Zimny Terrorysta
0

witam, jak zmienić ten kod aby nie powtarzało liczb?

 import java.util.Scanner;
import java.util.Arrays;
public class SymulatorLottomatu {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);

int licznik=0;
int[] tab = new int[6];
do{
    int liczba = (int)(Math.random()*49+1);
    tab[licznik] = liczba;
    licznik++;
}while(licznik<6);

for(int wynik : tab)
     System.out.println(wynik + " ");
}
}   

Pozostało 580 znaków

2015-01-05 19:30
1

#Wygeneruj zbiór liczb od zakres_min do zakres_max.
#Pomieszaj te liczby.
#Wypisz N pierwszych.

/* package whatever; // don't place package name! */
 
import java.util.*;
import java.lang.*;
import java.io.*;
 
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        ArrayList<Integer> numbers = new ArrayList<>();
        for(int i = 1; i < 50; ++i) {
            numbers.add(i);
        }
 
        Collections.shuffle(numbers);
 
        for(int i = 0; i < 6; ++i) {
            System.out.println(numbers.get(i));
        }
    }
}

Pozostało 580 znaków

2015-01-05 19:42
0

Musi być tablica? Może użyj Set, wtedy nawet jeśli wylosujesz taką samą to nie doda duplikatu. Np. coś takiego:

        Set<Integer> numbers = new HashSet<Integer>();
        int count = 6;
 
        while (numbers.size() < count) {
            numbers.add((int) (Math.random() * 49 + 1));
        }
 
        System.out.println("Wylosowane liczby");
        for(Integer number : numbers) {
            System.out.print(number + " ");
        } 
edytowany 5x, ostatnio: olek1, 2015-01-05 19:53
Tylko, że algorytm z użyciem Set nadal ma złożoność O(INF) - n0name_l 2015-01-05 19:44
Nie, nie ma. Tradycyjne określanie złożoności dla algorytmów, w których liczba operacji jest zmienną losową, nie ma sensu. Dla takich algorytmów stosuje się inne miary. - Krolik 2015-12-27 17:48

Pozostało 580 znaków

2015-01-05 20:30
0

Dopisz sobie sprawdzenie po wylosowaniu czy już masz taką liczbę, jeżeli nie to zapisz do tablicy, jeżeli tak to losuj jeszcze raz.
Tu masz gotowca :)
Losowanie bez powtórzeń

słabe. można lepiej krótko List&lt;Integer&gt; nums = IntStream.range(1,50).boxed().collect(Collectors.toList()); Collections.shuffle(nums); System.out.println(nums.subList(0, 6)); - karolinaa 2015-01-06 12:32
fajne; mam przekonanie, żeby najpierw dobrze poznać 7, a potem wziąć się za 8 :) - garai 2015-01-06 14:17
mam przekonanie, żeby najpierw dobrze poznać 7, a potem wziąć się za 8 nie ma aż tylu różnic, a ekspresja lepsza. - Koziołek 2015-01-07 11:43

Pozostało 580 znaków

2015-01-07 11:45
0

@karolinaa, to co wrzuciłaś w komentarzu jest najprostszym i najlepszym rozwiązaniem dla ograniczonego zbioru liczb całkowitych. Każde podejście w stylu "wylosuj, sprawdź i jak już jest wylosuj ponownie" jest mało wydajne.

Widziałem wykonywanie kodu studenckiego typu wylosuj, sprawdź, losuj ponownie. Losowane było 99% pikseli z bitmapy 1024x1024. Nie doczekałem końca. - bogdans 2015-01-07 13:23
dobre, zapamiętam to jak będę miał algorytmy i struktury danych :) - garai 2015-01-07 19:03
"Twórca" algorytmu nie wpadł nawet na to, by losować ten 1% pikseli do pominięcia. - bogdans 2015-01-07 19:21

Pozostało 580 znaków

2015-01-07 13:37
0

Rozwiązanie i chyba bardzo popularne (algorytm):
http://www.lifeincode.net/pro[...]etcode-next-permutation-java/

Pozostało 580 znaków

2015-12-25 13:28
0

Witam,

mam problem z Collections.shuffle();, mam taki fragment kodu, który przy którym do... while... nie działa i nie wiem dlaczego:

Integer[] zmienne = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        do {
        Collections.shuffle(Arrays.asList(zmienne));
 
        zOne = zmienne[0];
        zTwo = zmienne[1];
        zThree = zmienne[2];
        zFour = zmienne[3];
        zFive = zmienne[4];
        zSix = zmienne[5];
        zSeven = zmienne[6];
        zEight = zmienne[7];
        zNine = zmienne[8];
        zTen = zmienne[9];
 
        } while (zOne==1 && zTwo==2 && zThree ==3); 

Chyba, że jest jakaś inna opcja wylosowania cyfr 0-9 do w.w. int? Math.random raczej nie wchodzi w grę, chyba, że nie ma innego wyjścia :P

Pozdrawiam!

Pozostało 580 znaków

2015-12-25 14:21
1

Jaki jest cel programu? Taki, że w momencie gdy zOne będzie równe 1, zTwo równe 2 a zThree równe 3 to wychodzimy z pętli i już nie mieszamy? Jeśli tak to zmień warunek na:

while (!(zOne == 1) || !(zTwo == 2) || !(zThree == 3));

Czy cel jest przeciwny i mieszamy dopóki zOne równe 1, zTwo równe 2 i zThree równe 3. Wtedy twój warunek jest jak najbardziej ok.

Zamiast inicjalizacji tablicy możesz użyć javy 8:

IntStream.rangeClosed(1, 10).toArray();
edytowany 3x, ostatnio: olek1, 2015-12-25 14:23
Dzięki ;) zapomniałem, że do-while działa na true :P - Troller 2015-12-27 16:29

Pozostało 580 znaków

2015-12-25 16:45
Duży Kot
0

W ramach świąt prezentuje mój najnowszy program wypisujący 6 unikalnych liczb z przedziału 1 do 49. Ma on złożoność nieskończoność do sześcianu. Siedze już pół godziny i czekam aż program wypisze te 6 liczb i ciągle nic, ale Java wymaga cierpliwości.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
 
class Lotto {
    static boolean x = false;
 
    public static void main(String[] args) {
        ArrayList<Integer> arrlist = new ArrayList<>();
        HashSet<Integer> hash = new HashSet<>();
 
        while (x != true) {
 
            for (int i = 1; i < 50; ++i)
                arrlist.add((int) (Math.random() * 49) + 1);
 
            for (int s : arrlist)
                hash.add(s);
 
            if (hash.size() < 49) {
                arrlist.clear();
                hash.clear();
            } else
                x = true;
        }
 
        Integer[] tab = {};
        tab = hash.toArray(tab);
        ArrayList<Integer> arrlist2 = new ArrayList<>();
        Collections.addAll(arrlist2, tab);
        Collections.shuffle(arrlist2);
        List<Integer> sub = arrlist2.subList(1, 7);
        System.out.println(sub);
 
    }
}
 
po co to tutaj wkleiłeś. taki badziew - karolinaa 2015-12-26 13:44

Pozostało 580 znaków

2015-12-27 17:00
0

Witam,

szukam generatora liczb działającego jak.. licznik/stoper ale z pewnymi ograniczeniami. Piszę program, który rozwiązuje równania matematyczne, w których pod niewiadome podkłada różne cyfry (0-9). Próbowałem już kilku metod generowania liczb (Math.random/Collections.shuffle), i do krótkich równań, z max 5 niewiadomymi, działają. Jednak przy większej ilości traci to sens, po prostu program liczy, liczy i się nie może doliczyć :P

  1. Generowanie tylu cyfr jak długi jest string:
    String EqOne = ABCD;
    for (int i=3;i=EqOne.length();i++){
    int[] zmienne = new int [i]
    }

    (pewnie nawet w tych 4 linijkach zrobiłem jakiś błąd :P)

  2. Wygenerowane cyfry zapisane w tablicy, aby ich wartości mógł w prosty sposób "wyciągnąć":
    int zOne = zmienne[0];
    int zTwo = zmienne[1];
    //itd.
  3. Generowanie cyfr 0-9 i NIE MOGĄ się powtarzać, czyli np:
    zmienne = {0, 1, 2};
    zmienne = {1, 0, 9};
    zmienne = {3, 1, 5};
  4. Generowanie liczb rosnąco, czyli 0,1,2; 0,1,3;...;1,0,2; 1,0,3;...; 9,8,7;

Pozdrawiam!

ps. kombinuję z czymś takim:

int a, b, c, zOne, zTwo, zThree;
        for ( a = 0; a<10; a++){
            for ( b= 0; b<10; b++){
                for ( c=0; c<10;c++){
 
zOne = a;
zTwo = b;
zThree = c;
 
                }
            }
        }

I oczywiście są generowane cyfry takie jak potrzebuję, ale widzę tutaj przynajmniej 3 problemy :P:

  1. Cyfry się powtarzają (czyli jest zwykłe liczenie od 000 do 999)
  2. Nie wiem jak zatrzymać odliczanie w momencie kiedy zostanie znaleziona odpowiedź (np. abc=126, czyli np a=2, b=7, c=9)
  3. Mógłbym użyć takiej składanki do każdej opcji (czyli gdy string będzie równy 3, to wtedy 3x FOR, 4 - 4xFOR, itd), ale to trochę kiepskie rozwiązanie.

ps2. Problem 1 (powtarzające się cyfry) rozwiązany ;)

int a, b, c;
        for ( a = 0; a<10; a++){
            for ( b= 0; b<10; b++){
                for ( c=0; c<10;c++){
 
                    if (a==b)continue;
                    if (a==b)break;
 
                    if (a==c)continue;
                    if (a==c)break;
 
                    if (c==b)continue;
                    if (c==b)break;
 
        int zOne = a;
        int zTwo = b;
        int zThree = c;
 
        System.out.println("a = " + zOne);
        System.out.println("b = " + zTwo);
        System.out.println("c = " + zThree);
 
                }
            }
        }
edytowany 2x, ostatnio: Troller, 2015-12-27 18:00

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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