Avatar billede 11er Nybegynder
01. oktober 2010 - 23:02 Der er 9 kommentarer og
1 løsning

Hvis sidste 3 tal i tilfædigt udræk

Hej,

Hvis man bruger rendom er det så ikke muligt at lave noget kode der kan vise hvad de sidste 3 nummerer som er genereret er?

Jeg har burugt følgende kode til at generere nummerne med:


Private ReadOnly rng As Random = New Random
    Private nums As List(Of Integer) = New List(Of Integer)(New Integer() {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}


        nrdisplay.Text = nums.Count

        If nums.Count > 0 Then
            Dim ix As Integer = rng.Next(nums.Count)
            nrdisplay.Text = nums(ix).ToString
            nums.RemoveAt(ix)
        Else
            MessageBox.Show("Alle nummer er udtrukket")
        End If
Avatar billede arne_v Ekspert
01. oktober 2010 - 23:12 #1
Du kunne f.eks. have en Queue(OfInteger), enqueue de udtrukne og hvis der er mere end 3 så dequeue.
Avatar billede arne_v Ekspert
01. oktober 2010 - 23:36 #2
Demo kode:

Imports System
Imports System.Collections.Generic
Imports System.Linq

Namespace E
    Public Class LastN(Of T)
        Private lst As Queue(Of T) = New Queue(Of T)
        Private maxsiz As Integer
        Public Sub New(n As Integer)
            maxsiz = n
        End Sub
        Public Sub Add(o As T)
            lst.Enqueue(o)
            If lst.Count > maxsiz Then
                lst.Dequeue
            End If
        End Sub
        Public Function GetAll() As T()
            Return lst.ToArray   
        End Function
    End Class
    Public Class Program
        Public Shared Sub Main(args As String())
            Dim con As LastN(Of Integer) = New LastN(Of Integer)(3)
            con.Add(1)
            For Each v As Integer In con.GetAll
                Console.Write(" " & v)
            Next
            Console.WriteLine
            con.Add(2)
            For Each v As Integer In con.GetAll
                Console.Write(" " & v)
            Next
            Console.WriteLine
            con.Add(3)
            For Each v As Integer In con.GetAll
                Console.Write(" " & v)
            Next
            Console.WriteLine
            con.Add(4)
            For Each v As Integer In con.GetAll
                Console.Write(" " & v)
            Next
            Console.WriteLine
            con.Add(5)
            For Each v As Integer In con.GetAll
                Console.Write(" " & v)
            Next
            Console.WriteLine
            Console.ReadKey
        End Sub
    End Class
End Namespace
Avatar billede 11er Nybegynder
02. oktober 2010 - 12:09 #3
Nu er jeg total noob til VB,

Jeg forstår ikke helt koden, hvordan bygger jeg den ind i mit eksisterende kode.

Jeg bruger en label kaldet lblLast3 hvor tallene skal vises.
Avatar billede arne_v Ekspert
02. oktober 2010 - 17:14 #4
Her er en forbedret version:

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text

Namespace E
    Public Class LastN(Of T)
        Private lst As Queue(Of T) = New Queue(Of T)
        Private maxsiz As Integer
        Public Sub New(n As Integer)
            maxsiz = n
        End Sub
        Public Sub Add(o As T)
            lst.Enqueue(o)
            If lst.Count > maxsiz Then
                lst.Dequeue
            End If
        End Sub
        Public Function GetAll() As T()
            Return lst.ToArray   
        End Function
        Public Overrides Function ToString() As String
            Dim sb As StringBuilder = New StringBuilder
            For Each v As T In GetAll
                sb.Append(" ")
                sb.Append(v.ToString)
            Next
            Return sb.ToString.SubString(1)
        End Function
    End Class
    Public Class Program
        Public Shared Sub Main(args As String())
            Dim con As LastN(Of Integer) = New LastN(Of Integer)(3)
            con.Add(1)
            Console.WriteLine(con)
            con.Add(2)
            Console.WriteLine(con)
            con.Add(3)
            Console.WriteLine(con)
            con.Add(4)
            Console.WriteLine(con)
            con.Add(5)
            Console.WriteLine(con)
            Console.ReadKey
        End Sub
    End Class
End Namespace
Avatar billede arne_v Ekspert
02. oktober 2010 - 17:14 #5
Så kan du bruge:

lblLast3.Text = din3container.ToString
Avatar billede 11er Nybegynder
02. oktober 2010 - 19:02 #6
Hej arne_v,

Jeg har prøvet lidt af hvert, men kan ikke få det til virke. Så her er hele koden:

Public Class Form1
    ' Koden er til tælleren.
    Public int As Integer = 0

    'Arry til de tal der skal vises
    Private ReadOnly rng As Random = New Random
    Private nums As List(Of Integer) = New List(Of Integer)(New Integer() {1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Timer1.Start()

    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Label1.Text = nums.Count

        If nums.Count > 0 Then
            Dim ix As Integer = rng.Next(nums.Count)
            Label1.Text = nums(ix).ToString
            nums.RemoveAt(ix)
        Else
            MessageBox.Show("Alle nummer er udtrukket")
        End If
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Timer1.Stop()
    End Sub
End Class


Håber du kan hjælpe mig, hvis det er et spørgsmål om points så sig til.
Avatar billede arne_v Ekspert
02. oktober 2010 - 19:37 #7
Public Class Form1
    ' Koden er til tælleren.
    Public int As Integer = 0

    'Arry til de tal der skal vises
    Private ReadOnly rng As Random = New Random
    Private nums As List(Of Integer) = New List(Of Integer)(New Integer() {1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
    Private con As LastN(Of Integer) = New LastN(Of Integer)(3) ' <----

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

        Timer1.Start()

    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Label1.Text = nums.Count

        If nums.Count > 0 Then
            Dim ix As Integer = rng.Next(nums.Count)
            Label1.Text = nums(ix).ToString
            con.Add(nums(ix) ' <----
            nums.RemoveAt(ix)
            Label3.Text = con.ToString ' <----
        Else
            MessageBox.Show("Alle nummer er udtrukket")
        End If
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Timer1.Stop()
    End Sub
End Class
Avatar billede 11er Nybegynder
02. oktober 2010 - 20:14 #8
Kan få det til at virke en gang. Når jeg stopper den får jeg følgende fejl i design mode:

  "The class Form1 can be designed, but is not the first class in the file. Visual Studio requires that designers use the first class in the file. Move the class code so that it is the first class in the file and try loading the designer again."

Går ud fra at koden i kommentar #4 Skal stå ovenover Public Class Form1

Ellers kan jeg slet ikke få det til at virke.
Avatar billede 11er Nybegynder
02. oktober 2010 - 20:40 #9
Det virker fint arne_v, Tak for hjælpen.

Skulle bare Publich den istedet for at debugge den.

Smid et svar så du kan få point
Avatar billede arne_v Ekspert
02. oktober 2010 - 21:21 #10
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester