Pseudonáhodná čísla – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Pseudonáhodná čísla – Java – Fórum – Programujte.comPseudonáhodná čísla – Java – Fórum – Programujte.com

 

K4BlOs
~ Anonymní uživatel
56 příspěvků
9. 12. 2012   #1
-
0
-

Mám vytvořit program, který bude generovat pseudonáhodná čísla podle tohoto algoritmu:

1.zadané dvouciferné číslo umocní na druhou (např. 67^2)
2.z umocněného čísla použije první dvě cifry zleva (tzn. 67^2 = 4489 takže vybere cifry 44)
3.k těmto cifrám (44) přičte jedničku (44+1=45) a výsledek je číslo, které potřebuji
4.tento cyklus se má opakovat tak dlouho, dokud se mi nezačnou opakovat vygenerovaná čísla.

Všechna vygenerovaná čísla potřebuji uložit do pole, které bude mít velikost rovnu počtu vygenerovaných čísel.
Mám napsáno zatím tohle:

import java.util.*;

public class SP {
	private static Scanner sc = new Scanner(System.in);
	
	public static void main(String[] args) {
		System.out.println("Zadej dvouciferne cislo: ");
		int n = sc.nextInt();
		int PocetPrvku = 0;
		int vysledek;
		do {
		PocetPrvku++;
		int umocneno = (int) Math.pow(n , 2);
		if (umocneno >= 1000) {
			vysledek = (umocneno / 100) + 1;
		}  
	      else
	        vysledek = (umocneno / 10) + 1;
		} while (vysledek == vysledek);
		int[] pole = new int[PocetPrvku];
		for (int i = 0; i < pole.length; i++) { //vstup pole
			pole[i] = vysledek;
		}
	}
}

nevím jak mám nastavit tu podmínku toho cyklu aby se mi zastavil hned, když se začnou opakovat vygenerovaná čísla.

Nahlásit jako SPAM
IP: 176.12.115.–
Flowy
~ Anonymní uživatel
449 příspěvků
9. 12. 2012   #2
-
0
-

Potrebujes zistit ci aktualne cislo je rovnake ako predchadzajuce

If (rovnake) then break;
} while (true);

Skor by ma trapili cisla kedy ti vyjde cislo cez 10k alebo tiez ako vytvorit array ked nevies kolko bude mat poli

Nahlásit jako SPAM
IP: 178.41.146.–
K4BlOs
~ Anonymní uživatel
56 příspěvků
10. 12. 2012   #3
-
0
-

no jo ale jak to zjistím, když při generování těch čísel je ještě nemám v poli?Já potřebuju aby mi vygenerovaná čísla ukládal do pole jenže nevim jak velké to pole bude(to zjistím až po proběhnutí toho cyklu)

Nahlásit jako SPAM
IP: 176.12.115.–
Buco0
Newbie
10. 12. 2012   #4
-
0
-

Skus ich ukladat do ArrayList<Integer> a potom testovat cez contains(Integer.valueof(int)). Ked sa zacnu opakovat tak skonci cyklus a skopiruj do noveho pola cez toArray.

Nahlásit jako SPAM
IP: 195.91.111.–
Buco0
Newbie
11. 12. 2012   #5
-
0
-

Este ma napadlo, ze kedy sa ma skoncit ten cyklus? Ked sa vyskytne cislo, ktore uz je v poli alebo az ked sa vyskytne postupnost cisiel?

Ak len po vyskyte jedneho cisla, tak sa to da riesit cez ten ArrayList, alebo este vhodnejsi bude kontajner Set, ktory odstranuje duplicitu. Vytvoris si napr. Set<Integer> tempPole = new LinkedHashSet<Integer>(); a potom v podmienke cyklu len budes vysledky vypoctu doplnat do tohto tempPole. Pri pokuse o pridanie rovnakeho cisla vrati false, inak true. Takto nejak:

do {

} while(tempPole.add(Integer.valueOf(vysledek));

A potom uz len toto pole zkopirujes do normalneho int[] pola cez spominany tempPole.toArray().

Nahlásit jako SPAM
IP: 195.91.111.–
K4BlOs
~ Anonymní uživatel
56 příspěvků
11. 12. 2012   #6
-
0
-

ahoj, tak mam toto

import java.util.ArrayList;
 import java.util.List;
 import java.util.Scanner;
 
public class SP {
 
    static int dalsiClen(int cislo) {
         double umocneno = Math.pow(cislo, 2);
         String umocnenoStr = String.valueOf(umocneno);
         String prvniDveCisla = umocnenoStr.substring(0, 2);
         return Integer.parseInt(prvniDveCisla) + 1;
 
    }
 
    public static void main(String[] args) {
 
        Scanner scanner = new Scanner(System.in);
         int cislo = 0;
         while (cislo < 10) {//dokud zada menší číslo
 
            System.out.println("Zadej dvouciferne cislo: ");
 
            cislo = Math.abs(scanner.nextInt());
         }
         scanner.close();
 
        List<Integer> polePosloupnosti = new ArrayList<Integer>();
         polePosloupnosti.add(cislo);
         while (true) {
             cislo = dalsiClen(cislo);
             if (polePosloupnosti.contains(cislo)) {
                 break;
             }
             polePosloupnosti.add(cislo);
         }
         System.out.println("Velikost pole: " + polePosloupnosti.size());
         System.out.println("Pole vygenerovanych cisel: " +
 polePosloupnosti.toString());
     }
 }

jen bych ted potreboval ten CELY program velmi podrobne vysvetlit krok po kroku   , co jaky prikaz dela atd...

Nahlásit jako SPAM
IP: 176.12.115.–
Buco0
Newbie
11. 12. 2012   #7
-
0
-

#6 K4BlOs
Ako mozes napisat kod, ktoremu nerozumies? Trocha som ti upravil ten tvoj kod a pridal komentare, dufam, ze ti to pomoze.

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
 
public class SP {
 
    static int dalsiClen(int cislo) {
    	//vypocita druhu mocninu premennej cislo
         double umocneno = Math.pow(cislo, 2);
         //prevedie double na String pomocou wrapper class String
         String umocnenoStr = String.valueOf(umocneno);
         //priradi String od indexu 0 (vratane) po 2 (bez znaku na indexe 2) 
         String prvniDveCisla = umocnenoStr.substring(0, 2);
         //prevedie String na Integer a pripocita 1
         return Integer.parseInt(prvniDveCisla) + 1;
 
    }
 
    public static void main(String[] args) {
 
        Scanner scanner = new Scanner(System.in);
         int cislo = 0;
         while (cislo < 10) {//dokud zada menší číslo
 
         System.out.println("Zadej dvouciferne cislo: ");
         // absolutna hodnota zadaneho Integeru, pri inom datovom type vyhodi Exception
         cislo = Math.abs(scanner.nextInt());
         }
         scanner.close();
         //vytvorenie kontajneru ArrayList na uchovavanie objektov typu Integer
         List<Integer> polePosloupnosti = new ArrayList<Integer>();
         /*	Prida zadane cislo do ArraListu, v tvojom kode by to asi nemalo byt
          * pretoze chces aby naslo zhodu len s vygenerovanymi cislami a nie aj zo zadanym cislom
          *  polePosloupnosti.add(cislo);
          */
         while (true) {
             cislo = dalsiClen(cislo);
             
             //Ak kontajner obsahuje cislo tak vrati true
             // a break ukonci cyklus while
             if (polePosloupnosti.contains(cislo)) {            	 
                 break;
             }
             //inak novovygenerovane cislo prida do kontajneru
             else {
            	 polePosloupnosti.add(cislo);
             }             
         }         
         //Vypise velkost kontajneru
         System.out.println("Velikost pole: " + polePosloupnosti.size());
         //Vypise obsah pomocou toString()
         System.out.println("Pole vygenerovanych cisel: " + polePosloupnosti.toString());
     }
 }
Nahlásit jako SPAM
IP: 195.178.73.–
K4BlOs
~ Anonymní uživatel
56 příspěvků
11. 12. 2012   #8
-
0
-

strasne moc ti dekuju pomohlo  

Nahlásit jako SPAM
IP: 176.12.115.–
K4BlOs
~ Anonymní uživatel
56 příspěvků
11. 12. 2012   #9
-
0
-

jen jeste dodam, ze to to pole ma byt i s tim zadanym cislem, ale to uz je malickost diky

Nahlásit jako SPAM
IP: 176.12.115.–
Buco0
Newbie
11. 12. 2012   #10
-
0
-

#9 K4BlOs
V zadani to nebolo uvedene, ale ako vravis, to je uz malickost.

Nahlásit jako SPAM
IP: 195.178.73.–
K4BlOs
~ Anonymní uživatel
56 příspěvků
11. 12. 2012   #11
-
0
-

prosim te jeste jedna vec nevis jak mam y toho "List<Integer> polePosloupnosti" udelat normalni int[] pole?

Nahlásit jako SPAM
IP: 176.12.115.–
Buco0
Newbie
11. 12. 2012   #12
-
0
-

#11 K4BlOs

Nemozes to priradit priamo, pretoze ArrayList obsahuje Integer, ktore Java berie ako objekty. Jedna z moznosti je:

int[] pole = new int[polePosloupnosti.size()];
Iterator<Integer> iter = polePosloupnosti.iterator();
for(int i = 0; i<polePosloupnosti.size(); i++)	{
    	 pole[i] = iter.next().intValue();
}
Nahlásit jako SPAM
IP: 195.178.73.–
K4BlOs
~ Anonymní uživatel
56 příspěvků
11. 12. 2012   #13
-
0
-

zkusil jsem to ale vypis toho pole je nejakej divnej

Zadej dvouciferne cislo: 
10
20[10, 11, 13, 17, 29, 85, 73, 54, 30, 91, 83, 69, 48, 24, 58, 34, 12, 15, 23, 53]
20[I@152544e

v mainu to mam takto:

public static void main(String[] args) {
    	int cislo = vstupCisla();
    	List<Integer> vytvorenePole = vytvorPole(cislo);
    	int[] noveVytvorenePole = new int[vytvorenePole.size()];
    	Iterator<Integer> iter = vytvorenePole.iterator();
    	for(int i = 0; i < vytvorenePole.size(); i++)	{
    		noveVytvorenePole[i] = iter.next().intValue();
    	}
    	selectSort(noveVytvorenePole);
        System.out.println( + vytvorenePole.size() + vytvorenePole.toString());
        System.out.println( + noveVytvorenePole.length + noveVytvorenePole.toString());
    }
Nahlásit jako SPAM
IP: 176.12.115.–
Buco0
Newbie
11. 12. 2012   #14
-
0
-

#13 K4BlOs
noveVytvorenePole musis vypisat cez cyklus alebo si vytvor String a v tom cykle for co uz mas tam len pridavaj postupne prvky pola. noveVytvorenePole.toString() vracia ID toho pola ako objektu.

Nahlásit jako SPAM
IP: 195.178.73.–
K4BlOs
~ Anonymní uživatel
56 příspěvků
11. 12. 2012   #15
-
0
-

tak toto mi uz funguje

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;

/**
 * Samostatna prace z PPA1.
 * Trida generujici pseudonahodnach cisla, ktere uklada do pole a 
 * nasledne je seradi metodou SelectSort.
 * Vystupem je vizualizace posloupnosti nahodne vygenerovanych prvku a
 * vizualizace serazene posloupnosti. 
 * @author
 */

public class SP {
	
	/**
	 * Metoda pro vypocet clenu pseudonahodne posloupnosti
	 * @param cislo
	 * @return dve cifry z leva umocneneho cisla +1
	 */
    static int dalsiClen(int cislo) {
        double umocneno = Math.pow(cislo, 2); //vypocita druhu mocninu promenne cislo
        String umocnenoStr = String.valueOf(umocneno); //prevede double na String pomoci String
        String prvniDveCisla = umocnenoStr.substring(0, 2); //priradi String od indexu 0 po 2
        return Integer.parseInt(prvniDveCisla) + 1; //prevede String na Integer a pripocita 1
    }
    
    /**
	 * Metoda pro vstup startovaciho cisla posloupnosti.
	 * Osetrena proti zadani mensi hodnoty nez 10
	 * @param
	 * @return zadane cislo
	 */
    static int vstupCisla() {
    	Scanner scanner = new Scanner(System.in);
        int cislo = 0;
        while (cislo < 10) { //dokud zada mensi cislo
            System.out.println("Zadej dvouciferne cislo: ");
            cislo = Math.abs(scanner.nextInt());
        }
        scanner.close();
		return cislo;
    }
    
    /**
	 * Metoda ktera uklada vygenerovana cislo posloupnosti
	 * do ArrayListu a kontroluje, jestli vygenerovane
	 * cislo metodou dalsiClen() je jiz ulozeno nebo ne.
	 * @param cislo
	 * @return polePosloupnosti s vygenerovanymi cisly
	 */
    static List<Integer> vytvorPole(int cislo) {
    	List<Integer> polePosloupnosti = new ArrayList<Integer>(); //vytvoreni ArrayListu pro uchovavani objektu typu Integer
        polePosloupnosti.add(cislo); //Prida zadane cislo do ArraListu
        while (true) { //pridava vygenerovane cleny posloupnosti do ArrayListu
            cislo = dalsiClen(cislo);
            if (polePosloupnosti.contains(cislo)) { //kontroluje jestli uz ArrayList obsahuje stejne cislo, pokud ano, vrati true a break ukonci cyklus while
                break;
            }
            polePosloupnosti.add(cislo); //pokud ArrayList neobsahuje toto cislo, prida ho
        }
		return polePosloupnosti;
    }
    
    /**
	 * Metoda pro serazeni pole od nejmensiho po nejvetsi
	 * @param pole
	 */
    public static void selectSort(int[] pole) { 
    	for (int i = 0; i < pole.length - 1; i++) { //projede pole
    		int mensi = i; //ulozi si mensi hodnotu
    		for (int j = i + 1; j < pole.length; j++) { //projede pole o i + 1 dal
    			if (pole[mensi] > pole[j]) { //porovna mensi hodnotu s dalsi hodnotou, pokud je dalsi mensi, ulozi si ji
    				mensi = j;
    			}
    		}
    		if (mensi != i) { //serazeni pole
    		int tmp = pole[i];
    		pole[i] = pole[mensi];
    		pole[mensi] = tmp;
    		}
    	}
    }
    
    static int[] prevedPole(List<Integer> vytvorenePole) {
        int[] noveVytvorenePole = new int[vytvorenePole.size()];
    	Iterator<Integer> iter = vytvorenePole.iterator();
    	for(int i = 0; i < vytvorenePole.size(); i++) {
    		noveVytvorenePole[i] = iter.next().intValue();
    	}
        return noveVytvorenePole;
    }
    
    /**
     * Hlavni metodu muzeme spustit 2 zpusoby:
     * 
     * 1. Spusteni programu bez zadani parametru:
     *   Pomoci metody vstupCisla() program nacte dvouciferne cislo,
     *   ktere pouzije v metode dalsiClen() a vypocte pseudonahodnou posloupnost.
     *   Tuto posloupnost seradi metodou selectSort() a vypise ji.
     *   Neserazenou a serazenou posloupnost vykresli nastrojem DrawingTool.
     *   
     * 2. Spusteni programu se zadanim parametru:
     *   Z prikazove radky nacte parametr, ktery predstavuje jmeno vstupniho souboru.
     *   Z tohoto souboru precte postupne jedno dvouciferne cislo, 
     *   a vypocte pseudonahodnou posloupnost, kterou ulozi do vystupniho souboru.
     *   Dale precte dalsi dvouciferne cislo a opakuje vypocet
     *   pseudonahodne posloupnosti, kterou ulozi do vystupniho souboru k predchozimu
     *   dvoucifernemu cislu. Tento cyklus se opakuje dokud program neprecte posledni
     *   dvouciferne cislo ze vstupniho souboru.
     *   Osetreni vyjimek pro spatne zadane cislo nebo spatne zadane jmeno souboru
     *   neni nute. Predpokladaji se vzdy spravne hodnoty.
     * @param 
     */
    public static void main(String[] args) {
    	int cislo = vstupCisla();
    	List<Integer> vytvorenePole = vytvorPole(cislo);
        int[] prevedenePole = prevedenePole = prevedPole(vytvorenePole);
    	selectSort(prevedenePole);
        System.out.println( + vytvorenePole.size() + vytvorenePole.toString());
        System.out.println( + prevedenePole.length + Arrays.toString(prevedenePole));
    }
}

ted vy se ta neserazene a serazena posloupnost mela vykreslit do grafu pomoci nastroje DrawingTool ale to ted jete nechci resit. Chtel bych vyřešit to že když z příkazové řádky bude program spuštěn s parametrem ktery bude predstavovat jmeno vstupniho textoveho souboru "vstup.txt" (overovani spravneho nazvu neni nutne). Vstupni soubor bude mit na kazde radce jedno dvouciferne cislo ktere bude startovaci hodnotou pro posloupnost. Pocet tech radku neni omezen a hodnoty se mohou opakovat. Pro každou startovaci hodnotu se tedy vytvori posloupnost (ktera mi uz funguje) a zapise se do vystupniho textoveho souboru "vystup.txt" (v podobe: na prvni radce neserazena posloupnost a hned pod ni na druhe radce serazena posloupnost a pro dalsi startovaci hodnotu ze vstupniho souboru to bude oddeleno jednou prazdnou radkou a pak zase neserazena a pod ni serazena pos.) Po zpracovani vsech radek vstupniho souboru program hned konce(nevipisuje nic na obrazovku a neceka na zadne vstupy) všechny vyjimky se maji resit pouze pomoci "e.printStackTrace()" abych pravdu rekl vubec nevim jak na to  

ukazka vstupniho souboru vstup.txt:

Nahlásit jako SPAM
IP: 176.12.115.–
K4BlOs
~ Anonymní uživatel
56 příspěvků
11. 12. 2012   #16
-
0
-

ukazka vstup.txt:

10
11
83

vystup by mel vypadat takto vystup.txt:

20[10, 11, 13, 17, 29, 85, 73, 54, 30, 91, 83, 69, 48, 24, 58, 34, 12, 15, 23, 53]
20[10, 11, 12, 13, 15, 17, 23, 24, 29, 30, 34, 48, 53, 54, 58, 69, 73, 83, 85, 91]

19[11, 13, 17, 29, 85, 73, 54, 30, 91, 83, 69, 48, 24, 58, 34, 12, 15, 23, 53]
19[11, 12, 13, 15, 17, 23, 24, 29, 30, 34, 48, 53, 54, 58, 69, 73, 83, 85, 91]

16[83, 69, 48, 24, 58, 34, 12, 15, 23, 53, 29, 85, 73, 54, 30, 91]
16[12, 15, 23, 24, 29, 30, 34, 48, 53, 54, 58, 69, 73, 83, 85, 91]

poradi mi nekdo nebo napise nejaky navod?

Nahlásit jako SPAM
IP: 176.12.115.–
Buco0
Newbie
11. 12. 2012   #17
-
0
-
Nahlásit jako SPAM
IP: 195.178.73.–
K4BlOs
~ Anonymní uživatel
56 příspěvků
17. 12. 2012   #18
-
0
-

Ahoj napsal jsem to takto, ale nefunguje mi to poradi nekdo?

if(args.length > 0) {
            try {
                BufferedReader bfr = new BufferedReader(new FileReader(args[0]));
                BufferedWriter bfw = new BufferedWriter (new FileWriter("vystup.txt"));
                String radek;
                while((radek = bfr.readLine())!= null) {
                    int nacteneCislo = Integer.parseInt(radek);
                    List<Integer> vytvorenePole = vytvorPole(nacteneCislo);
		    int[] prevedenePole = prevedPole(vytvorenePole);
		    selectSort(prevedenePole);
		    bfw.write("" + vytvorenePole.size() + "" + vytvorenePole.toString());
		    bfw.write("" + prevedenePole.length + "" + Arrays.toString(prevedenePole));
		    bfw.newLine();
                }
                bfr.close();
                bfw.close();
            } catch (FileNotFoundException e) {
		e.printStackTrace();
            } catch (IOException e) {
    		e.printStackTrace();
            }     
        }

debug:
Zadej dvouciferne cislo:
vstup.txt
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:909)
at java.util.Scanner.next(Scanner.java:1530)
at java.util.Scanner.nextInt(Scanner.java:2160)
at java.util.Scanner.nextInt(Scanner.java:2119)
at Ppa1_SP_A12B0046K.Ppa1_SP_A12B0046K.vstupCisla(Ppa1_SP_A12B0046K.java:26)
at Ppa1_SP_A12B0046K.Ppa1_SP_A12B0046K.main(Ppa1_SP_A12B0046K.java:151)
Java Result: 1

Nahlásit jako SPAM
IP: 176.12.115.–
Buco0
Newbie
18. 12. 2012   #19
-
0
-

#18 K4BlOs
V tomto useku chyba asi nebude. Pozri riadok 26 v vstupCisla a 151 v main. Zrejme skusas nacitat nejaky String cez nextInt.

A prikazy:

bfr.close();
bfw.close();

by mali byt v bloku finally.

Nahlásit jako SPAM
IP: 195.178.73.–
K4BlOs
~ Anonymní uživatel
56 příspěvků
21. 12. 2012   #20
-
0
-

jj vse vyreseno. Dekuji Buco

Nahlásit jako SPAM
IP: 176.12.115.–
Buco0
Newbie
21. 12. 2012   #21
-
0
-

#20 K4BlOs
Ak si program uz dokoncil oznac vlakno za vyriesene 

Nahlásit jako SPAM
IP: 195.91.111.–
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, 5 hostů

Podobná vlákna

Čísla — založil Michal

CIsla — založil Nery

Čísla — založil Onsi

Nenulove cisla — založil Viki

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ý