IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Proházení čísel v polích (arrays)

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Martin H.
Člen
Avatar
Martin H.:24.11.2018 18:48

Zdravím, potřeboval bych poradit.. Kdy potřebuji v poli, ve kterém jsou čísla (počet x <-- zadává uživatel) je náhodně proházet mezi sebou.
tedy:

x zadána uživatelem:

int[] Array = new int[x];
Array[0] = 1;

for(int i=0; i<x; i++){

Array[x]= i+1;

}

Zkusil jsem:

Chci docílit: A teď potřebuji jednotlivá čísla mezi sebou proházet..
Jinak řečeno, potřebuji vytvořit řadu náhodně jdoucích čísel, která se nebudou opakovat.

Díky, M.H. :)

 
Odpovědět
24.11.2018 18:48
Avatar
Jirka
Člen
Avatar
Jirka:24.11.2018 19:51

Ahoj,

něco jsem zkusil a takto to dopadlo:

package itn.forum;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

class Data {
private List<Integer> lst;
private static int getRandInt(int n) { return ThreadLocalRandom.current().nextInt(0, n); }
public void mix() {
        for(int i = 0, s = lst.size(); i < s; i ++) {
                lst.add(lst.remove(getRandInt(s)));
        }
}
public Data(Integer[] array) { lst = new LinkedList<>(Arrays.asList(array)); }
@Override
public String toString() {
        String s = "";
        for(int i = 0; i < lst.size(); i ++) {
                s += (i != 0?", ":"") + "{" + lst.get(i) + "}";
        }
        return "{" + s + "}\n";
}
}

public class TopX {
public static void main(String[] args) {
        Data data = new Data(new Integer[] {0, 1, 2, 3}); //obsahuje testovane hodnoty
        System.out.println(data);
        data.mix();
        System.out.println(data);
}
}
Nahoru Odpovědět
24.11.2018 19:51
Kdo nic nedělá, nic nezkazí.
Avatar
Martin H.
Člen
Avatar
Odpovídá na Jirka
Martin H.:24.11.2018 21:05

Děkuji moc,
funguje to dobře, jen se obávám, že nejsem dost dobrý programátor na to, abych dané hodnoty dokázal dostat do jednoho pole, se kterým bych potom nadále pracovat.

řekněme, že budu mít pole o 3 místech, kdy na 1. místě bude 1 na 2. 2 a na 3. 3.. tedy

array[0]=1
array[1]=2
array[2]=3

Teď nějaká funkci, kterou projde, která bude mít za úkol náhodně proházet pořadí.
A vyhodí jiné pole, které když vypíši bude mít místo původního výsledku (1,2,3) například výsledek (1,3,2)


Tento poskytnutý program transformuje pole následně do "string" podoby.. a já nejsem schopen to z toho dostat..

A nebo se nemusí využívat polí vůbec.. Zkrátka potřebuji, abych dokázal vypsat určitý počet náhodně jdoucích čísel, která se ale nebudou opakovat.. Napadlo mě řešení zkusit to přes změnu pořadí v poli a lámal jsem si s tím hlavu, bohužel to nedopadlo, proto jsem se šel zeptat sem..

Omlouvám se, ale nedokážu si s tím poradit, ale opravdu děkuji za poskytnuté řešení, ještě zkusím to nějak vytvořit ..

Editováno 24.11.2018 21:06
 
Nahoru Odpovědět
24.11.2018 21:05
Avatar
Martin H.
Člen
Avatar
Odpovídá na Martin H.
Martin H.:24.11.2018 21:43

Problém vyřešen, už jsem to dokázal vytvořit :)

 
Nahoru Odpovědět
24.11.2018 21:43
Avatar
Odpovídá na Martin H.
Petr Štechmüller:24.11.2018 21:46

Ahoj, celý tvůj problém lze vyřešit na jeden řádek :)

ThreadLocalRandom.current().ints(0, 10).distinct().limit(6).forEach(System.out::println);

// ThreadLocalRandom.current().ints(0, 10) --> generátor náhodných čísel v polootevřeném intervalu <0, 10)
// distinct() --> zajistí unikátní čísla
// limit(6) --> počet vygenerovaných unikátních čísel
// forEach --> nakonec se to vypíše do konzole
Nahoru Odpovědět
24.11.2018 21:46
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Martin H.
Člen
Avatar
Martin H.:25.11.2018 14:07

Děkuji, už jsem našel vlastní fungující řešení ..

Ale díky :)

 
Nahoru Odpovědět
25.11.2018 14:07
Avatar
Odpovídá na Martin H.
Matúš Olejník:25.11.2018 14:14

Tak by si ho mohol poslať a uzavrieť toto vlákno ;)

Nahoru Odpovědět
25.11.2018 14:14
/* I am not sure why this works but it fixes the problem */
Avatar
Jirka
Člen
Avatar
Odpovídá na Martin H.
Jirka:25.11.2018 18:59

Promiň za pauzu.

Za mě to vypadá takto:

package itn.forum;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.ThreadLocalRandom;

class Data {
private List<Integer> lst;
private static int getRandInt(int s) { return ThreadLocalRandom.current().nextInt(0, s); }
private void exx() {
        int index = getRandInt(lst.size());
        int index2 = getRandInt(lst.size());
        Integer temp = lst.get(index);
        lst.set(index, lst.get(index2));
        lst.set(index2, temp);
}
public void mix() {
        for(int i = 0; i < lst.size(); i ++) {
                exx();
        }
}
public Data() { lst = new ArrayList<>(); }
public void add(Integer value) { lst.add(value); }
@Override
public String toString() {
        String s = "";
        for(int i = 0; i < lst.size(); i ++) {
                s += (i != 0?", ":"") + "{" + lst.get(i) + "}";
        }
        return "{" + s + "}\n";
}
}

public class TopX {
public static void main(String[] args) {
        Data data = new Data();
        Scanner sc = new Scanner(System.in);

        for(;;) {
                System.out.println("Zadej číslo, enter to quit: ");
                String temp = sc.nextLine();
                if(System.lineSeparator().startsWith(temp)) { break; }
                data.add(Integer.parseInt(temp));
        }

        sc.reset();
        System.out.println(data);
        System.out.println("Mixuji...\n");
        data.mix();
        System.out.println(data);
}
}
Nahoru Odpovědět
25.11.2018 18:59
Kdo nic nedělá, nic nezkazí.
Avatar
Jirka
Člen
Avatar
Odpovídá na Martin H.
Jirka:27.11.2018 17:58

Ahoj.

Tak jsem ještě vylepšil efektivitu mixování:

package itn.forum;

import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

class Data {
private List<Integer> lst;
private static int getRandInt(int s) { return ThreadLocalRandom.current().nextInt(0, s); }
public void mix() {
        for(int i = 0, s = lst.size(); i < s; i ++) {
                Collections.swap(lst, getRandInt(s), getRandInt(s));
        }
}
public Data() { lst = new LinkedList<>(); }
public Data(Integer[] arr) { this(); lst.addAll(Arrays.asList(arr)); }
public void add(Integer value) { lst.add(value); }
@Override
public String toString() {
        String s = "";
        for(int i = 0; i < lst.size(); i ++) {
                s += (i != 0?", ":"") + "{" + lst.get(i) + "}";
        }
        return "{" + s + "}\n";
}
}

public class TopX {
public static void main(String[] args) {
//      Data data = new Data();
        Data data = new Data(new Integer[] {10, 20, 30, 40, 50});
/*
        Scanner sc = new Scanner(System.in);
        for(;;) {
                System.out.println("Zadej číslo, enter to quit: ");
                String temp = sc.nextLine();
                if(System.lineSeparator().startsWith(temp)) { break; }
                data.add(Integer.parseInt(temp));
        }
        sc.reset();
*/
        System.out.println(data);
        System.out.println("Mixuji...\n");
        data.mix();
        System.out.println(data);
}
}

Jirka

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
27.11.2018 17:58
Kdo nic nedělá, nic nezkazí.
Avatar
Jirka
Člen
Avatar
Odpovídá na Martin H.
Jirka:1.12.2018 12:35

Díky, senza :)

Nahoru Odpovědět
1.12.2018 12:35
Kdo nic nedělá, nic nezkazí.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.