Java začátečník , generátor náhodnych čísel - pole – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Java začátečník , generátor náhodnych čísel - pole – Java – Fórum – Programujte.comJava začátečník , generátor náhodnych čísel - pole – Java – Fórum – Programujte.com

 

hokii
~ Anonymní uživatel
3 příspěvky
5. 10. 2012   #1
-
0
-

Zdravím , mám takový problémek , začínám s javou a úkol do školy zněl že mám udělat generátor náhodných čisel , čisla aby byla v intervalu <1,20> (což je první problém bylo mi to vysvětleno způsobem 

pole[i]=(int)(Math.random()*10+1); - toto mám v cyklu for , ale důležité je že toto mi generuje čisla 1-10,ale nevím jak udělat čísla 1-20

druhá vec je že mám toto vygenerovat do pole , což mám ale mám udělat logickou metodu , které zajistí aby čísla byla stejná ... což vůbec netuším jak

celé zadání zní

Sestavte program, který pole o n prvcích naplní celými náhodnými čísly z intervalu <1,20>.
*Pokud bude do n načteno číslo menší nebo rovno nule, opakujte načítání.
Při naplňování pole zajistěte,  *aby se do pole neuložila stejná čísla. Pro zjištění duplicity sestavte vlastní
logickou metodu.
*Vytiskněte každé vygenerované číslo a vypočítejte, kolik bylo nutné vygenerovat čísel, aby se naplnilo n prvkové pole.
*Výsledné pole vytiskněte a nabídněte možnost celý výpočet opakovat

Nahlásit jako SPAM
IP: 78.45.231.–
Šťouchal0
Stálý člen
5. 10. 2012   #2
-
0
-

Math.random vrací hodnotu 0-1 (double), takže stačí když uděláš toto:

pole[i]=(int)(Math.random()*19+1);
Nahlásit jako SPAM
IP: 213.168.191.–
hokii
~ Anonymní uživatel
3 příspěvky
5. 10. 2012   #3
-
0
-

super no a jak zajistím v metodě , aby pole bylo naplněno  nestejnými čísly?

zatím mám zhruba toto

public static void main (String[] args)
  {
   Scanner sc = new Scanner(System.in);
   int a[];
  int n = 0;
  
   do {
  System.out.print("Zadej pocet prvku pole: ");
  n = sc.nextInt();
  } while(n <=0);
 
  a = new int[n];
 

  System.out.print("Generovaná čísla jsou: "); 
  for (int i = 0; i < a.length; i++)
  {
  a[i] =(int)(Math.random()*19+1);
  System.out.print(a[i]+ " ");
  }
 
  }}

Nahlásit jako SPAM
IP: 78.45.231.–
Šťouchal0
Stálý člen
5. 10. 2012   #4
-
0
-

Naplnění pole neshodnými hodnotami bych udělal tak, že bych iteroval nad jednotlivými pokyny:

  • vygeneruj mi náhodné číslo
  • projdi stávající pole a zjisti, zda se daná hodnota v poli nachází
  • pokud se nenachází, tak hodnotu zapiš a pokračuj na další prvek v poli
  • pokud se nachází tak pokračuj v iteraci

Editace:
Ještě doplním, že při velikosti pole větší, než je počet možných prvků nastane zacyklení. Dále může nastat velice dlouhé provádění výše popsaného algoritmu, jelikož se hodnoty generují pseudonáhodně, tudíž se na některé musí někdy "počkat" než je generátor vygeneruje.
 

Nahlásit jako SPAM
IP: 213.168.191.–
hokii
~ Anonymní uživatel
3 příspěvky
5. 10. 2012   #5
-
0
-

#4 Šťouchal
no dobře , ale nevím jakym zpusobem to zapsat ... dělam v tom pár dní ...postup ktery měl podle mě fungovat nefungoval ... takže nevím příkazy co a jak ...

public static int kontrolaDuplikace (int[] pole)
{
int generace = 1;
int dupl = 0;
while (generace > 0)
{
generace = 0;
for (int i = 0 ;  i < pole.length ; i++)
{ for (int j = 1 ; j <pole.length ;j++)
  { if (pole[i] == pole[j])
   { generace++;
    pole[i]=(int)(Math.random()*19+1);
    System.out.print(" " + pole[i]);
    dupl++; 
   }
  }
}
}
System.out.println("\nPocet celkove vygenerovanych čísel: " + (pole.length + dupl) );
return pole;
}

return pole mi samozřejmě nefunguje ... myslel jsem že to udělam tim zpusobem že porovnam čísla a když je nějake stejne tak vygeneruju jine , pokud generuju jine čislo tak do proměnne generace zapišu 1 , timpadem na začatku funkce zjistim jestli se čislo měnilo (udělam znovu kontrolu) nebo ne ... vypišu čisla zpatky do mainu

Nahlásit jako SPAM
IP: 78.45.231.–
Dano
~ Anonymní uživatel
101 příspěvků
8. 10. 2012   #6
-
0
-

Co takto skusit takto  

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class NahodneCisla {

    // velkost vrateneho pola nahodnych cisiel
    private Integer velkostPola = 10;
    // generator nahodnych cisiel
    private Random random = new Random();
    // pocitadlo behu generovania nahodnych cisiel
    private int beh = 0;

    /**
     * Vrati zoznam nahodnych cisiel
     *
     * @return
     */
    public Integer[] getPoleNahodnychCisiel() {
        Set<Integer> nahodneCisla = new HashSet<Integer>();
        // pokym sa nenaplni cele pole
        while (nahodneCisla.size() < getVelkostPola()) {
            Integer noveCislo = getNahodneCislo();
            // do setu sa nedaju dat dve rovnake hodnoty, overenie duplicity
            nahodneCisla.add(noveCislo);
        }
        // potrebujeme pole, tak zoznam prehodime do pola
        return new ArrayList<Integer>(nahodneCisla).toArray(new Integer[nahodneCisla.size()]);
    }

    /**
     * Vygenerujeme si nahodne cislo, musi platit, ze nove cislo > 0, pritom si
     * updatene pocet cyklov potrebnych na vygenerovanie
     *
     * @return
     */
    private Integer getNahodneCislo() {
        Integer cislo = 0;
        while (cislo <= 0) {
            cislo = random.nextInt(20);
            beh++;
        }

        return cislo;
    }

    /**
     * Vrati pocet cyklov potrebnych na vygenerovanie potrebneho pola nahodnych
     * cisiel.
     *
     * @return
     */
    public int getPocetBeh() {
        return beh;
    }

    public int getVelkostPola() {
        return velkostPola;
    }

    public void setVelkostPola(Integer velkostPola) {
        this.velkostPola = velkostPola;
    }

    public static void main(String[] args) {
        NahodneCisla n = new NahodneCisla();

        Integer[] pole = n.getPoleNahodnychCisiel();
        System.out.println("potrebnych cyklov: " + n.getPocetBeh());
        System.out.println("vygenerovane cisla:");
        for (Integer cislo : pole) {
            System.out.print(cislo + " ");
        }
        // prazdny riadok nakoniec
        System.out.println("");
    }
}
Nahlásit jako SPAM
IP: 195.28.127.–
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, 16 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ý