Toon posts:

[VB.Net] Unieke random getallen genereren *

Pagina: 1
Acties:
  • 418 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik ben een programma aan het schrijven in VB.NET voor mijn school, het is een lottoformulier genereren, allemaal niet zo moeilijk dit is mijn code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
 Private Sub btnQuickPick_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnQuickPick.Click
        Dim Lotto(11, 5), i, j As Integer
        Dim strLotto As String
        strLotto = ""
        For i = 0 To 11
            For j = 0 To 5
                Lotto(i, j) = Int(Rnd() * 42 + 1)
                strLotto &= Lotto(i, j).ToString & Space(3)
            Next
            strLotto &= vbNewLine
        Next
        txtLotto.Text = strLotto
    End Sub


Nu zou ik een controle willen inbouwen dat als hij een getal vind dat al in de array staat dat hij dat getal opnieuw berekent zodat er geen dubbele getallen inzitten. Heeft iemand hier een oplossing voor, ik kan er zelf niet aan uit. BBVB

(Heb een beetje een verkeerde titel gebruikt sorry)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Pseudo:
Visual Basic .NET:
1
2
3
4
5
For T = 1 to 10
  Do
    Getal = RandomGetal
  Loop Until Not InLijst(Getal)
Next


Er zijn zat betere en efficiëntere algoritmes; dit is het simpelst ;)

[ Voor 47% gewijzigd door RobIII op 25-05-2007 09:41 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10 08:18
wat RobIII al zegt, een lijst bijhouden met welke getallen je al gehad hebt, en ipv de Rnd() functie te gebruiken gebruik je een eigen functie die ongeveer doet wat robIII ze pseudocode doet ;)

This message was sent on 100% recyclable electrons.


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:32

Janoz

Moderator Devschuur®

!litemod

Tja, regel 7 opsplitsen. Daar maak je een paar nieuwe lusjes die kijken of in de voorgaande vakjes dat nummer al staat. Maar beter is nog om gewoon eerst een lijst van 55 random getallen te maken en er dan voor zorgen dat ze allemaal uniek zijn. Vervolgens gebruik je deze lijst om je 2d array te vullen

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Yoozer
  • Registratie: Februari 2001
  • Laatst online: 03-08 17:53

Yoozer

minimoog

Je kunt ook overwegen een Hashtable te gebruiken - dan is je Key je unieke nummer en je Value een bool die aangeeft of 't in de trekking zit of niet, en je kunt er dan een interface omheen bakken die vrij gemakkelijke de inhoud kan laten zien. Hashtables hebben van zichzelf al als vereiste dat de ingevoerde waarden sowieso al uniek moeten zijn, en wat er optreedt als je een dubbele waarde invoert kun je netjes afvangen. Het probleem is echter hetzelfde als "gooi opnieuw als je geen 6 hebt gegooid" - als je vervolgens 20 keer geen 6 gooit ben je veel langer met het genereren bezig.

(of dit goedkoper is qua overhead betwijfel ik overigens, maar het concept van je formulier zit dan in 1 datatype)

Het feit dat een lottoformulier er in het echt uitziet als een rechthoek van 11 bij 5 wil niet zeggen dat 't er in de code ook zo uit moet zien :).

teveel zooi, te weinig tijd


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20:39

gorgi_19

Kruimeltjes zijn weer op :9

Zie ook [VB] Randomize, niet 2 keer hetzelfde getal :)

Daarnaast: waarom geen stringbuilder ipv een string en waarom gebruik je VBNewLine ipv Environment.NewLine ?

[ Voor 41% gewijzigd door gorgi_19 op 25-05-2007 10:10 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Yoozer schreef op vrijdag 25 mei 2007 @ 10:03:
Je kunt ook overwegen een Hashtable te gebruiken - dan is je Key je unieke nummer en je Value een bool die aangeeft of 't in de trekking zit of niet, en je kunt er dan een interface omheen bakken die vrij gemakkelijke de inhoud kan laten zien. Hashtables hebben van zichzelf al als vereiste dat de ingevoerde waarden sowieso al uniek moeten zijn, en wat er optreedt als je een dubbele waarde invoert kun je netjes afvangen. Het probleem is echter hetzelfde als "gooi opnieuw als je geen 6 hebt gegooid" - als je vervolgens 20 keer geen 6 gooit ben je veel langer met het genereren bezig.

(of dit goedkoper is qua overhead betwijfel ik overigens, maar het concept van je formulier zit dan in 1 datatype)
Dat betwijfel ik ook; als het maar om 6 cijfers gaat, dan denk ik niet dat de performance winst van een Hashtable de overhead teniet doet. Een simpel loopje zal ook wel snel genoeg zijn.

Als je gebruik maakt van .NET 2.0 kan je wel een HybridDictionary gebruiken. Deze class kiest zelf de beste implementatie naar gelang de grootte van je collection. (Voor kleine collections gebruikt deze intern een ListDictionary, en voor grote collecties een Hashtable; echter, je kan natuurlijk ook direct een ListDictionary gebruiken).

https://fgheysels.github.io/


  • ? ?
  • Registratie: Mei 2007
  • Niet online

? ?

..

[ Voor 133% gewijzigd door ? ? op 25-01-2013 09:53 ]

Pagina: 1