Generátor náhodných čísel v intervalu bez opakování – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Generátor náhodných čísel v intervalu bez opakování – Java – Fórum – Programujte.comGenerátor náhodných čísel v intervalu bez opakování – Java – Fórum – Programujte.com

 

Michal
~ Anonymní uživatel
683 příspěvků
9. 11. 2012   #1
-
0
-

Ahoj, chci se zeptat, potřeboval bych v Jave vygenerovat 9 čísel z intervalu <1,9> bez opakování. Vytvořil jsem generátor čísel od 1do9, ale vůbec nemůžu přijít na to, jak zařídit aby se neopakovali.

    int[] array = new int[9];
    Random R = new Random(array.length);      
    int number = 0;
    
        for (int i = 0; i < array.length; i++) {
      
           number = R.nextInt(9)+1;   
           array[i] = number;

        }

Prozatím jsem došel k úvaze, že bych potřeboval nějak ověřit, nově vygenerované číslo, jestli se nerovná již dříve vygenerovaným a v případě že jo, tak vygenerovat nové a zase ho ověřit - problém je, že vůbec nevím jak něco takového napsat.

Díky za případné rady.

Nahlásit jako SPAM
IP: 81.201.55.–
Dano
~ Anonymní uživatel
101 příspěvků
9. 11. 2012   #2
-
0
-

Podla Tvojho zadania dostanes vzdy [1, 2, 3, 4, 5, 6, 7, 8, 9]

Nahlásit jako SPAM
IP: 195.28.127.–
KIIV
~ Moderátor
+43
God of flame
9. 11. 2012   #3
-
0
-

ja sem  takovy veci resil zamichanim .. cisla tam nahazes poporade a promichas..  nejaky shuffle algoritmy urcite sou na netu ... kdo vi treba to umi java rovnou

Nahlásit jako SPAM
IP: 62.216.147.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Michal
~ Anonymní uživatel
683 příspěvků
9. 11. 2012   #4
-
0
-

Dano: Nemám moc náladu na slovíčkaření, zkus to jinde ;).

KIIV: Jo, o tom už jsem taky uvažoval a možná mi nic jiného nezbyde, ale chtěl jsem vědět jestli neexistuje nějaká přímá cesta. Každopáně díky.

Nahlásit jako SPAM
IP: 81.201.55.–
Dano
~ Anonymní uživatel
101 příspěvků
9. 11. 2012   #5
-
0
-

#4 Michal
Nehram sa na slovickarenie, vychadzam z Tvojho zadanie, predpokladam, ze ide o poradie cisiel a nie o mnozinu cisiel, no aby som bol aj konkretny, tak poskytnem konkretny navrh.

/**
 * Vygenerovanie pola nahodnych cisiel
 *
 * @param pocet pocet prvkov v poli
 * @param min   minimalna hodnota nahodneho cisla
 * @param max   maximalna hodnota nahodneho cisla
 * @return      vygenerovane pole
 */
public Integer[] getPoleNahodnychInteger(int pocet, int min, int max) {
    // do setu sa nedaju zadat dve rovnake hodnoty, osetrenie duplicity
    Set<Integer> zoznam = new HashSet<Integer>();
    Random random = new Random();
    // interval, z ktoreho budeme generovat nahodne cisla
    int interval = (max - min + 1);
    // pokym nenaplnime zoznam ...
    while(zoznam.size() < pocet) {
        // k vygenerovanemu cislu priratame minimalnu hodnotu nahodnych cisiel
        zoznam.add(random.nextInt(interval) + min);
    }
    // vygenerovany zoznam nahodnych cisiel
    System.out.println("zoznam=" + zoznam);
    // prehododenie do Array
    List<Integer> list = new ArrayList<Integer>();
    list.addAll(zoznam);
    Integer[] pole = list.toArray(new Integer[list.size()]);
    // hotovka
    return pole;
}
Nahlásit jako SPAM
IP: 195.28.127.–
Michal
~ Anonymní uživatel
683 příspěvků
9. 11. 2012   #6
-
0
-

Hmm, děkuju za snahu, bohužel mi to ale moc nepomohlo... Půlku věcí z tvýho zápisu ještě neznám a nevím jak fungujou... Nešlo by to udělat nějak "jednodušejš" - respektive pomocí jednodušších příkazů?

Nahlásit jako SPAM
IP: 81.201.55.–
TheOndrap+2
Super člen
9. 11. 2012   #7
-
0
-

#4 Michal
Já teda nevím proč obviňuješ Dana ze slovíčkaření.

Podle mě jsou zde z v podstatě 2 cesty jak to udělat.

  • Udělat si pole a do něj cyklicky generovat čísla tak dlouho, dokud nebude plné, jak to napsal Dano
  • Udělat si pole, do něj nahrnout čísla 1-9 a ty zamíchat, jak říkal KIIV

Jednodušejí to podle mě nejde.

Abych vysvětlil ten Danovo kód:

Set<Integer> zoznam = new HashSet<Integer>();

--- tohle je v podstatě pole, do něhož můžeš zadávat pouze unikátní hodnoty. To znamená že když se tam pokusíš zadat číslo, které už tam je, tak se to číslo neuloží.

Druhá možnost je udělat toto:

/*vytvorim pole*/
ArrayList arrayList = new ArrayList();
int delka=10;

/*do pole pridam cisla 1-9*/
for(int i=1; i<delka; i++){
	arrayList.add(i);
}

System.out.println("Pole pred promichanim : "+arrayList);
/* pole promíchám */
arrayList.shuffle();
System.out.println("Pole po promichani : "+arrayList);

Ondra

Nahlásit jako SPAM
IP: 88.102.250.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
Dano
~ Anonymní uživatel
101 příspěvků
9. 11. 2012   #8
-
0
-

Oki, myslim si, ze jednoduchsie to asi nepojde ;)

public Integer[] getPomiesanyZoznam() {
    Integer[] zoznam = new Integer[] {
            1, 2, 3, 4, 5, 6, 7, 8, 9
    };
    Collections.shuffle(Arrays.asList(zoznam));

    return zoznam;
}
Nahlásit jako SPAM
IP: 195.28.127.–
TheOndrap+2
Super člen
9. 11. 2012   #9
-
0
-

#8 Dano
souhlas

Nahlásit jako SPAM
IP: 88.102.250.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
Michal
~ Anonymní uživatel
683 příspěvků
9. 11. 2012   #10
-
0
-

Ok, děkuju za dovysvětlení... Pravděpodobně zvolím druhou variantu s tím zamícháním, je pro mě pochopitelnější. Nicméně se chci zeptat ještě na pár věcí k tomu:

zápis Integer je stejný jako int ? Nebo je v tom nějaký diametrální rozdíl ?

Proč v té fci Collections.shuffle musí být list a nemůže tam být pole? Popřípadě neexistuje něco podobného čistě pro pole?

Díky

Nahlásit jako SPAM
IP: 81.201.55.–
Michal
~ Anonymní uživatel
683 příspěvků
9. 11. 2012   #11
-
0
-

V každým případě mi to teda nefunguje. :-/

 

  public static void main(String[] args) {
        
        for (int i = 0; i < 9; i++) {
       
        System.out.println(gen()[i]);
        
        }
         
    }
    
    
    public static int[] gen(){
    
    int[] array = new int[]{1,2,3,4,5,6,7,8,9};
    
    Collections.shuffle(Arrays.asList(array));
       
    return array;
    }
Nahlásit jako SPAM
IP: 81.201.55.–
Dano
~ Anonymní uživatel
101 příspěvků
10. 11. 2012   #12
-
0
-

zápis Integer je stejný jako int ? Nebo je v tom nějaký diametrální rozdíl ?

v podstate je to rovnake, rozdiel je v type, int je primitivny typ, to znamena, ze vzdy bude mat nastavenu realnu hodnotu, napr. 0, Integer je object typu int a moze nadobudat aj hodnotu null.


Proč v té fci Collections.shuffle musí být list a nemůže tam být pole? Popřípadě neexistuje něco podobného čistě pro pole? 

Array neimplementuje rozhranie Collection, preto sa s polom neda pracovat ako s kolekciou. Preti je praca s polom velmi obmedzujuca a v realnom java devel svete sa pouziva malo casto. Castejsie sa pouzivaju List, Set, Map, ...

Tvoj kod nefunguje preto, lebo si nepouzil typ object (Integer), ale typ primitive (int), ked int zmenis na Integer, vsetko je tak, ako ma :) Len male upozornenie na zaver, ked chces vypisat prvky v takomto jednoduchom poli, da sa to urobit aj nasledovne: 

Integer[] array = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9};
System.out.println("array=" + Arrays.asList(array));
Nahlásit jako SPAM
IP: 78.98.48.–
TheOndrap+2
Super člen
10. 11. 2012   #13
-
0
-

#12 Dano
jako vysvětlení je to samozřejmě korektní a Michal to z toho pochopí, ale jenom bych upřesnil že Integer je třída která obaluje primitivní datový typ int.

Nahlásit jako SPAM
IP: 213.129.142.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
Michal
~ Anonymní uživatel
683 příspěvků
10. 11. 2012   #14
-
0
-

Ok, super. :) Moc děkuju za pomoc.

Nahlásit jako SPAM
IP: 81.201.55.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 1 host

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý