Náhodné čísla   zodpovězená otázka

VB.NET, .NET

Mám kód ktorý mi generuje náhodné čísla od 1 do 18 a opakuje to 10 krát.

For a As Integer = 1 To 10
            Dim Hodnota As Integer = CInt(Int((18 * Rnd()) + 1))
            
        Next

Ako sa dá spraviť aby sa náhodné číslo neopakovalo.

V prípade, že náhodné číslo je také isté ako už vygenerované číslo, tak by sa proces s náhodným číslo opakoval až pokiaľ by vygenerované číslo malo hodnotu ktorá ešte nebola vygenerovaná. Ako sa dá toto spraviť ?

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

staci misto rnd pouzit funkci randomize

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Ospravedlňujem sa samozrejme, že som použil Randomize. Proste sa stane, že sa občas čísla opakujú.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jediny co muzu v tomto pripade poradit, je zvetsit rozmezi pro nahodna cisla napr. nahodna cisla do 100.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

To nieje moc dobrý nápad lebo ja potrebujem čísla len od 1 po 18. Ak mi vygeneruje číslo nad 18, tak mi program nebude pracovať tak ako má.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Teoreticky bych si přidal pole o 9-ti prvcích a každou vygenerovanou hodnotu bych si tam ukládal. Ale ještě před samotným uložením hodnoty, se musí provést kontrola pomocí smyčky, kde se projedou všechny předchozí hodnoty v poli. A vpřípadě že bude shoda tak se musí generovat znova.

Až se dostanu domu, tak sem hodim klidně i nějaký kód.

Vím, není to asi nejelegantnější řešení, ale například v pascalu se to tak řešilo dost často :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Prosím Ťa ak potom budeš mať čas, tak sem hoď niejaký kód. Ja som to tiež skúšal robiť s polom ale nedarilo sa mi. Nvedel som ako mám dať prehladávať cele pole.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak už som na to asi prišiel. Včera som sa s tým trápil celí deň a nemohol som na to prísť. Ak má niekto lepší nápad tak to sem hoďte. Dík za pomoc.

 Dim Pole(9) As Integer
        For i As Integer = 0 To 9
10:         Dim hodnota As Integer = CInt(Int((18 * Rnd()) + 1))
            For b As Integer = 0 To 9
                If hodnota = Pole(b) Then
                    GoTo 10
                End If
            Next
            Pole(i) = hodnota
        Next

nahlásit spamnahlásit spam 3 / 3 odpovědětodpovědět

Aha spatne jsem to pochopil, myslel jsem aby cisla nebyla stejna po kazdem spusteni. Jde o to, ze funkce rnd() vraci po kazdem spusteni stejna poradi nahodnych cisel. A to jsem mel na mysli.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
Dim randomNumbers As New System.Collections.Generic.List(Of Integer)
Dim randomNumber As Integer
Dim randomizer As New Random
randomNumber = randomizer.Next(1, 18)
For index As Integer = 0 To 9
  While randomNumbers.Contains(randomNumber)
    randomNumber = randomizer.Next(1, 18)
  End While
  randomNumbers.Add(randomNumber)
Next

Tímto máte zajištěno, že čísla se nebudou nikdy opakovat.

nahlásit spamnahlásit spam -1 / 3 odpovědětodpovědět

Ahoj,jsem laik a nemám žádné zkušenosti a chtěl bych se zeptat když budu mít 6 labelů na generování náhodných čísel(sportka) jak to udělat aby se čísla neshodovala.Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Stačí si založit nějaký seznam, ten čísly naplnit a pak vždy čísla po vylosování odebrat. A nové náhodné číslo generovat v rozsahu počtu položek v tomto seznamu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji panu Ondřeji Linhartovi za nápovědu.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Jo tak nějak jsem to myslel, pak ti sem hodim, jak to udělat bez toho GoTo. Pokud to je do školy, tak doporučuju spíše toto řešení než to od Ondřeje Linharta.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A mohu se zeptat z jakého důvodu není můj příklad vhodný pro použití ve škole?

nahlásit spamnahlásit spam -3 / 3 odpovědětodpovědět

Protože začínající programátor bude hledat nejdříve cestu podobnou té mé, pomocí toho co umí, co zná, co ho ve škole učí. Když jsem začínal, asi první dva roky školy, tak po nás bylo výslovně vyžadováno takové řešení jaké předkládám.

Pokud někdo přišel s řešením (jako je třeba to vaše), pak to automaticky znamenalo že to našel někde na netu. A pak stejně dotyčný ani nevěděl, co co dělá.

Prostě začátěčník na vaše řešení nepříde. Podobné postupy objevuje postupně, časem.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ústav kde při programování aplikují takovýto fašistický přístup bych chtěl skutečně navštěvovat...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Bohužel často není na výběr. Já osobně jsem na školy neskutečně alergický. Je to trošku offtopic, ale nemohl jsem si to odpustit.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Label1.Text = CStr(Int(Rnd() * 18)) 'Náhodné číslo
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Randomize() 'Opravdu náhodné číslo!
    End Sub
End Class

Já to tedy řeším takhle. Při kliknutí na tlačítko button1 ti label1 vypíše náhodné číslo.Ale nvm jestli je to tvůj případ.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Mr. Tomáš Danita má v podstate pravdu. Som len začiatočník a fakt moc tomu kódu ktorý napísal Mr. Ondřej Linhart moc nerozumiem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Peter,

to, že si začátečník není žádná hamba, otázkou ale je, zdali s tím chceš něco udělat.

Řešení pana Linharta je velice elegantní a z hlediska složitosti nejde o žádnou světobornou věc - pokud by jsi věnoval pár odpolední a přečetl sis seriál "Začínáme", vše co pan Linhart použil tam je vysvětleno.

Složité Vám to, možná, připadá díky honosně znějícím anglickým názvům, ale je to pouhopouhá aplikace práce s kolekcemi a generátorem náhodných čísel.

A pokud Vám ve škole brání v "samostudiu", resp. ve využívání Intellisense ve Visual Studiu (tam totiž při aplikaci velice jednoduše naleznete třeba tu použitou metodu randomizer.next(1,18), a nevidím důvod, proč ji nepoužít a "složitě" to přepočítívat), pak bych dost začal pochybovat o snaze Vašich pedagogů Vás něčemu přiučit.

Důležité, samozřejmě, je, abyste poskytnutý kód slepě neopsal, ale snažil se jej pochopit - a pokud Vám něco není jasné, tak se zeptejte.

Doufám, že se na mne pan Linhart nebude zlobit, když Vám jeho kód okomentuji, abyste viděl, že v tom skutečně není nic zvláštního (současně si dovolím z pedagogických důvodů přejmenovat proměnné pro lepší pochopení:

' deklarujeme kolekci pro uložení náhodných čísel
' teoreticky by bylo možno ve Vašem případě použít pole,
' ale kolekce je obecnější (nemusíme předem znát počet prvků)
Dim kolekceNahodnychCisel As New System.Collections.Generic.List(Of Integer)

' deklarujeme proměnnou pro uložení získaného náhodného čísla
Dim nahodneCislo As Integer

' deklarujeme proměnnou pro generátor náhodných čísel
Dim generatorNahodnychCisel As New Random

' z generátoru získáme náhodné číslo v rozsahu od 1 do 18
nahodneCislo = generatorNahodnychCisel.Next(1, 18)

' potřebujeme 10 náhodných čísel, proto si spustíme cyklus, který se vykoná právě 10x
For index As Integer = 0 To 9

  ' smyčka pro kontrolu již existujících čísel
  While kolekceNahodnychCisel.Contains(nahodneCislo)
    ' pokud naše kolekce již číslo "nahodneCislo" obsahuje,
    ' vybere se nove nahodne cislo a test cyklu While se s timto novym cislem zopakuje
    nahodneCislo = generatorNahodnychCisel.Next(1, 18)
  End While

  ' pokud jsme se dostali až sem (prošli jsme cyklem While...End While
  ' je jasné, že číslo "nahodneCislo" v kolekci ještě nemáme
  ' proto je do kolekce přidáme
  kolekceNahodnychCisel.Add(nahodneCislo)
Next   ' a pokračujeme v hledání dalšího čísla (celkem 10x)

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Tak už mi je ten kó jasnejší. Dík za popis.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jak si to tady čtu, nedá mi to nereagovat. Pokud vás ve škole učí přímo konkrétně Visual Basic .NET a v něm funkce Rnd a Randomize, což je přežitek ze starších verzí, tak je to velice tristní. Pokud vás učí Visual Basic 6 nebo Visual Basic integrovaný v Microsoft Office, pak je to naprosto správně.

Ve VB.NET bychom totiž měli používat třídu Random, která je součástí .NET frameworku a umí generovat náhodná čísla daleko lépe.

Abych shrnul, jak je to s náhodnými čísly doopravdy.

Pokud budete používat Rnd, bude po spuštění programu vyhazovat pořád stejná čísla. Generátor náhodných čísel se totiž nachází v jakémsi výchozím stavu. Pokud chcete s funkcí Rnd generovat náhodná čísla opravdu náhodně, je nutno při startu programu zavolat funkci Randomize, která generátoru nastaví nějaký počáteční stav podle aktuálního času (takže to už víceméně bude generovat pokaždé jinak).

Podotýkám ale, že tyto dvě funkce jsou přežité a zastaralé, správně bychom měli využívat třídu Random.

Při vytvoření nového objektu třídy Random se generátor náhodnách čísel zinicializuje a bude vyhazovat již náhodná čísla, nesmíte ale generátor inicializovat při každém použití, to pak nefunguje tak, jak má. Zkrátka na začátku před samotným generováním si nadeklarujte proměnnou r, která bude držet objekt generátoru:

Dim r As New Random()

Pro generování čísel pak využijte funkci Next tohoto objektu (a jako parametr přidáte horní mez). Pokud tedy programujete třeba házení kostkou, napíšete tohle:

MsgBox(r.Next(6) + 1)

r.Next(6) vrací náhodná čísla od 0 do 5, ale na kostce padají čísla 1 až 6, takže musíme k tomuto přičíst ještě jedničku.

Dejte tohle, prosím, přečíst svému učiteli. Nemyslím si, že vás to chtějí učit špatně, možná o třídě Random ví, ale nechtějí do začátečníků hned cpát objekty. Podle mě je na tom kus pravdy, na druhou stranu - je jedno, jestli si studenti zapamatujím že na začátku napíší Randomize a pak generují pomocí Rnd, anebo jestli na začátku napíší Dim r As New Random() a pak generují pomocí r.Next. V tomto případě to není o tolik složitější a chápání toho, že se vlastně vytváří objekt, je celkem zbytečné, na to přijdou sami časem, až naberou zkušenosti.

nahlásit spamnahlásit spam 3 / 3 odpovědětodpovědět

Ještě je dobré, pokud chcete zajistit neopakování násobit Random časem....

nahlásit spamnahlásit spam -5 / 5 odpovědětodpovědět

A jak toto číslo převedu na integer?? Dejme tomu že chci k základu přičítat náhodné číslo

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Súhlasím, ale myslím si, že potom by zo začínajúcich študentov mohlo vyjsť niečo takéto:

Public Class A
  Public Sub B()
    Dim r As New Random()
    REM nejaký kód
  End Sub
  Public Sub C()
    Dim r As New Random()
    REM nejaký kód
  End Sub
  Public Sub D()
    Dim r As New Random()
    REM nejaký kód
  End Sub
End Class

Čo má jednu nevýhodu - každá procedúra si založí vlastný Random, a to mi pripadá dosť neefektívne. Osobne by som to upravil tak, že Dim r As New Random presuniem do deklarácií k triede A, a potom už len využívam jeden a ten istý Random vo všetkých metódach triedy.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Chtěl jsem se zeptat když chci generovat čísla od 2-12(2hrací kostky) tak nevím jak to zapsat,aniž by mi to generovala 1 a čísla nad 12

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Založte na nový dotaz nové vlákno.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback