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: Problem se zjistovanim intervalu v generatoru nahodnych cisel

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Ondrej Zadrapa:13.5.2020 14:04

Caute, dost slusne jsem se zaseknul u jedne ulohy na procviceni cyklu. Mam vytvořit program, který mi vygeneruje 10 nahodnych cisel od -90 do 101 a mam vypsat do konzole soucet cisel, které jsou v intervalu 10 az 50, vyzkousel jsem vicero zpusobu, tenhle je poslední, ale porad mi soucet pise 0, netusim, kde delam chybu. Dekuji za kazdou radu, která mi pomuze.

Zkusil jsem:

Sub Main()
        Dim random As New Random()
        Dim soucet As Integer
        For a As Integer = 1 To 10
            Console.WriteLine(random.Next(-90, 101))
            If soucet = random.Next > 10 AndAlso soucet = random.Next < 50 Then
                soucet += 1
            End If
        Next
        Console.WriteLine()
        Console.WriteLine(soucet)
        Console.ReadKey()
    End Sub
 
Odpovědět
13.5.2020 14:04
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:13.5.2020 14:30

Nastav hodnotu proměnné soucet na 0. V cyklu o deseti opakování proveď následující příkazy. Přiřaď proměnné rnd vygenerované náhodné číslo v rozsahu. Pokud proměnná splňuje podmínku intervalu, přičti její hodnotu k proměnné soucet.

soucet += rnd

Vypiš proměnnou soucet na obrazovku.

Nahoru Odpovědět
13.5.2020 14:30
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:13.5.2020 14:57
Sub Main()
        Dim random As New Random()
        Dim soucet As Integer = 0
        Dim rnd As Integer
        For a As Integer = 1 To 10
            Console.WriteLine(random.Next(-90, 101))
            If rnd > 10 AndAlso rnd < 50 Then
                soucet += rnd
            End If
        Next
        Console.WriteLine()
        Console.WriteLine(soucet)
        Console.ReadKey()
    End Sub

Porad mi to pise nulu, nevim, co s tim.

 
Nahoru Odpovědět
13.5.2020 14:57
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:13.5.2020 15:16

Nepřiřazuješ proměnné rnd vygenerované číslo v daném rozsahu.
Podívej na úryvek kódu psaném v C.

int soucet = 0;
for(int i = 0; i < 10; i++){
    rnd = rand_range(-90, 101);
    if((rnd >= 10)&&(rnd <= 50)) soucet += rnd;
}
printf("%d", soucet);
Editováno 13.5.2020 15:17
Nahoru Odpovědět
13.5.2020 15:16
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Ondrej Zadrapa:13.5.2020 15:30
Sub Main()
        Dim random As New Random()
        Dim soucet As Integer = 0
        For a As Integer = 1 To 10
            Dim rnd = random.Next(-90, 101)
            If ((rnd >= 10) AndAlso (rnd <= 50)) Then
                soucet += rnd
            End If
        Next
        Console.WriteLine()
        Console.WriteLine("{0}", soucet)
        Console.ReadKey()
    End Sub

Tak ted uz to nefunguje vůbec, ja nevim, co delam spatne.

 
Nahoru Odpovědět
13.5.2020 15:30
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:13.5.2020 16:15

Pokud něco nefunguje, tak je třeba ladit. Dále je dobré být konkrétnější (program nejde spustit, chybná hodnota, dochází k pádu aplikace, apod.). V prvé řadě je třeba najít místo kde se chyba vyskytuje. Vypisuj si obsahy proměnných. Ověř si, zdali Ti funguje generování náhodných čísel. Rovněž by Ti měl být jasný princip, jak mnou prezentovaný úryvek kódu funguje.

Nahoru Odpovědět
13.5.2020 16:15
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na Ondrej Zadrapa
Matúš Olejník:13.5.2020 17:20

Nekódil som ešte vo Visual Basicu ale podľa zvyšku kódu by som povedal, že aj tu treba povedať aký dátový typ má byť premenná rnd

Dim rnd = random.Next(-90, 101)

kód vyššie by som zmenil na

Dim rnd As Integer = random.Next(-90, 101)
Nahoru Odpovědět
13.5.2020 17:20
/* I am not sure why this works but it fixes the problem */
Avatar
Ondrej Zadrapa:13.5.2020 19:18
Sub Main()
        Dim random As New Random
        Dim pocetCiselVIntervalu = 0
        For i As Integer = 0 To 9
            Console.WriteLine(random.Next(-90, 101))
            Dim interval As Integer = random.Next(-90, 101)
            If interval >= 10 And interval <= 50 Then
                pocetCiselVIntervalu += interval
            End If
        Next
        Console.Write("{0}", pocetCiselVIntervalu)
        Console.ReadKey()

Vsechno mozne vyzkousene, ted uz to pro zmenu neplive 0 v poctuCiselVIn­tervalu, ale rovnou si to vyhodi nahodne číslo, proste nejake. No nic, budu rad, když se nakonec ukaze spasitel, který mi rekne, ze jsem debil, hodi sem nejake dvouradkove reseni a ja budu konecne vedet jak na to. :D :D Ale i tak diky za snahu, ale problém to nevyresilo

 
Nahoru Odpovědět
13.5.2020 19:18
Avatar
Odpovídá na Ondrej Zadrapa
Matúš Olejník:13.5.2020 20:16

Veď v zadaní píšeš že máš zistiť SÚČET čísiel ktoré sú v tom intervale a nie ich počet, takže to máš takmer dobre len namiesto

Console.WriteLine(random.Next(-90, 101))

Daj

Console.WriteLine(interval)

Ale daj to až pod ten riadok kde to číslo generuješ. Potom si spočítaj čísla ktoré sú v intervale <10, 50> a porovnaj s tým čo máš v pocetCiselVIn­tervalu.

Teraz vypisuješ iné náhodne čísla než v skutočnosti kontroluješ lebo ich generuješ dva krát

Editováno 13.5.2020 20:17
Nahoru Odpovědět
13.5.2020 20:16
/* I am not sure why this works but it fixes the problem */
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Matúš Olejník
DarkCoder:13.5.2020 20:41

Jo to je tak když se pořád něco mění. Ta proměnná pojmenovaná soucet tam nebyla jen tak. Pokaždé různé způsoby deklarace, různé způsoby výpisů, různé řídící příkazy.. Syntax jazyka je take super. Pro deklaraci proměnné skoro nestačí řádek, random.next(x,y) - je jasný že jde o interval nebo Console.Write("{0}", pocetCiselVIn­tervalu) - také jasné, že jde o výpis celočíselné hodnoty. :-D

Nahoru Odpovědět
13.5.2020 20:41
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na Matúš Olejník
Ondrej Zadrapa:13.5.2020 21:01

Díky, zítra to vyzkouším, teprve měsíc a nějaké drobné se to učím a zrovna kombinaci FOR + RND dělám úplně poprvé. Pro mě je to daleko chaotičtější.

 
Nahoru Odpovědět
13.5.2020 21:01
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:13.5.2020 21:05

Vyzkoušej to ještě dnes ať můžeš v klidu spát. Je to otázkou 10s. Jinak cyklus s náhodnými čísly vůbec nesouvisí, je to stejné jako jakýkoli jiný příkaz. Máš pocit že je to chaotické, protože ještě nemáš dostatek zkušeností. Ale to přijde..

Nahoru Odpovědět
13.5.2020 21:05
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:13.5.2020 21:45

Se spánkem problém mít nebudu problém, ale můj problém je stejně nevyřešený, teď už to dává součet (děkuji moc, to se bude rozhodně někdy hodit), ale mě zajímal počet, že když vygeneruje 10 náhodných čísel a z toho 2 budou třeba 20 a 30, tak mi to vypíše 2. Teď mi to vypisuje 50. Čili součet. Ale i tak díky, fakt v tom plavu a skripta stojí za starou belu.

 
Nahoru Odpovědět
13.5.2020 21:45
Avatar
Ondrej Zadrapa:13.5.2020 21:48
Sub Main()
        Dim random As New Random
        Dim pocetCiselVIntervalu = 0
        For i As Integer = 0 To 9
            Dim interval As Integer = random.Next(-90, 101)
            If interval >= 10 AndAlso interval <= 50 Then
                pocetCiselVIntervalu += interval
            End If
            Console.WriteLine(interval)
        Next
        Console.WriteLine("Pocet cisel v intervalu 10 az 50 = {0}", pocetCiselVIntervalu)
        Console.ReadKey()
    End Sub

Ted to dava soucet tech nahodnych cisel, které se ocitnou v intervalu 10 az 50, coz je super, diky moc, ale spatne jsem svůj dotaz formuloval, za to se omlouvam, me zajima počet cisel v intervalu, cili at uz to je 10,20,30, proste at mi to vyplivne ten počet, ne soucet. Rad bych s tim nikoho neotravoval a poradil si sam, ale fakt netusim jak dal, zatím se mi to dařilo svepomoci jenom zhoršovat.

 
Nahoru Odpovědět
13.5.2020 21:48
Avatar
Odpovídá na Matúš Olejník
Ondrej Zadrapa:13.5.2020 21:52

Pardon, ale jelikož jsem osel, tak se chci opravit. V zadani mělo byt pocet cisel v intervalu. Ono i slovo soucet je spravne, pokud z deseti nahodnych cisel byly 2 v intervalu 10 - 50, tak soucet poctu cisel v intervalu je 50, ale zjistuji, ze v programovani a na forech se clovek musí vyjadřovat jinak, cestina je zradna, mam s tim dokola problem. :D

 
Nahoru Odpovědět
13.5.2020 21:52
Avatar
Odpovídá na Ondrej Zadrapa
Ondrej Zadrapa:13.5.2020 22:00

No, už dělám i chyby v komentářích, místo součet 50 mělo být 2.

 
Nahoru Odpovědět
13.5.2020 22:00
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:13.5.2020 22:24

Doporučuji se na vyjadřování se více zaměřit, zamezíš tak mnoha problémům v důležitějších věcech nežli je tato úloha. Pojmy součet a počet jsou odlišné. Pro oboje platí akorát to, že proměnná, která bude pro daný výpočet použita, musí být inicializována na 0. Pak platí:

pocet += 1
soucet += generovane_cislo_splnujici_podminku_intervalu

Pozn: Dobře zvolené jméno proměnné odpovídající jejímu významu je pro úspěch zásadní.

Nahoru Odpovědět
13.5.2020 22:24
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:13.5.2020 22:45

No nic, zítra to zkusím, ale stejně mám obavu, že to nakonec budu muset vidět napsané celé. Přesto díky

 
Nahoru Odpovědět
13.5.2020 22:45
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 18 zpráv z 18.