开发者

Problem Exception and Random number

i make a lottery in VB.NET

i got an error when i simulate the thing. To write in a file any "billet" generate the error is :

Invalid CastException was unhandled: The conversion of the chain "[" in 'Double' was invalid

Also, i don't know how to make a series of random number between 1 to 49 for each number of a Billet object

Here's my code

Public Class Billet

Dim _num1, _num2, _num3, _num4, _num5, _num6 As Integer
Dim rand As Random

Sub New(ByVal _num1 As Integer, ByVal _num2 As Integer, ByVal _num3 As Integer, ByVal _num4 As Integer, ByVal _num5 As Integer, ByVal _num6 As Integer)
    Me.Num1 = _num1
    Me.Num2 = _num2
    Me.Num3 = _num3
    Me.Num4 = _num4
    Me.Num5 = _num5
    Me.Num6 = _num6
End Sub

Public Property Num1() As Integer
    Get
        Return _num1
    End Get

    Set(ByVal Value As Integer)
        _num1 = Value
    End Set
End Property

Public Property Num2() As Integer
    Get
        Return Num2
    End Get

    Set(ByVal Value As Integer)
        _num2 = Value
    End Set
End Property

Public Property Num3() As Integer
    Get
        Return _num3
    End Get

    Set(ByVal Value As Integer)
        _num3 = Value
    End Set
End Property

Public Property Num4() As Integer
    Get
        Return Num4
    End Get

 开发者_Python百科   Set(ByVal Value As Integer)
        _num4 = Value
    End Set
End Property

Public Property Num5() As Integer
    Get
        Return _num5
    End Get
    Set(ByVal value As Integer)

    End Set
End Property

Public Property Num6() As Integer
    Get
        Return _num6
    End Get
    Set(ByVal value As Integer)

    End Set
End Property

Public Overrides Function ToString() As String
    Return "[" + Num1 + "]"   <----- ERROR :Invalid CastException : La conversion de la chaîne "[" en type 'Double' n'est pas valide.
End Function

End Class

Imports System.Random
Imports Microsoft.VisualBasic.FileIO
Imports System.IO


Public Class Simulation
Dim tabBillet As New ArrayList
Dim billetGagnant(5) As Integer

Sub GenerateBillet(ByVal nbmin As Integer, ByVal nbmax As Integer)
    Randomize()

    Dim value As Integer = CInt(Int((nbmax * Rnd()) + nbmin))

    For i As Integer = 0 To value
        For j As Integer = 0 To 6
            Dim num As Integer = CInt(Int((49 * Rnd()) + 1))
            tabBillet.Add(New Billet(num, num, num, num, num, num))
        Next
    Next

    ecrireFic(tabBillet)

End Sub

Function GenerateGagnant()
    Randomize()

    For i As Integer = 0 To 5
        Dim numero As Integer = CInt(Int((49 * Rnd()) + 1))
        billetGagnant(i) = numero
    Next
    Return billetGagnant
End Function

Public Sub ecrireFic(ByVal tabBillet As ArrayList)
    Dim path As String = "H:\test.txt"
    Dim sw As StreamWriter

    If File.Exists(path) = False Then
        sw = File.CreateText(path)
    End If

    sw = File.AppendText(path)
    For i As Integer = 0 To 3
        sw.WriteLine(tabBillet.Item(i).ToString())
    Next
    sw.Flush()
    sw.Close()

    ' Open the file to read from.'
    Dim sr As StreamReader = File.OpenText(path)
    Dim s As String
    Do While sr.Peek() >= 0
        s = sr.ReadLine()
        Console.WriteLine(s)
    Loop
    sr.Close()
End Sub

End Class


A generic lottery

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

    Dim myLotto As New Lottery(49) 'fill the hopper
    myLotto.Draw(6) 'draw the balls
    Debug.WriteLine(myLotto.ToString) 'get the results

    'OR get the results one item at a time
    For x As Integer = 0 To myLotto.Count - 1
        Debug.WriteLine(myLotto.Item(x))
    Next
End Sub

Class Lottery
    Private Shared PRNG As New Random
    Private _theHopper As List(Of Integer)
    Private _draw As List(Of Integer)

    Public Sub New(maxNumber As Integer)
        Me.MaxNumber = maxNumber
        Me._theHopper = New List(Of Integer)
        Me._theHopper.AddRange(Enumerable.Range(1, Me.MaxNumber).ToArray)
    End Sub

    Private _maxNumber As Integer
    Public Property MaxNumber() As Integer
        Get
            Return Me._maxNumber
        End Get
        Set(ByVal value As Integer)
            Me._maxNumber = value
        End Set
    End Property

    Public Sub Draw(numberOfBalls As Integer, _
                    Optional DuplicatesAllowed As Boolean = False)
        Me._draw = New List(Of Integer)
        Dim whichNum As Integer
        For ct As Integer = 1 To numberOfBalls
            whichNum = PRNG.Next(Me._theHopper.Count)
            Me._draw.Add(Me._theHopper(whichNum))
            If Not DuplicatesAllowed Then Me._theHopper.RemoveAt(whichNum)
        Next
    End Sub

    Public Overrides Function ToString() As String
        If Me._draw Is Nothing Then
            Return Nothing
        Else
            Dim sb As New System.Text.StringBuilder
            For Each num As Integer In Me._draw
                sb.Append(num)
                sb.Append(" ")
            Next
            Return sb.ToString
        End If
    End Function

    Public ReadOnly Property Count() As Integer
        Get
            Return Me._draw.Count
        End Get
    End Property

    Public Function Item(itemNum As Integer) As Integer
        Return Me._draw(itemNum)
    End Function
End Class


You can have something like

Dim rnd As New Random()
Dim b As New Billet(rnd.Next(49), rnd.Next(49), rnd.Next(49), rnd.Next(49), rnd.Next(49), rnd.Next(49))

to create each of your Billet objects.


You should use ampersands (&) for String concatenation. The + operator on a double tries to convert the String to a double rather than converting the double to a String as you are expecting. So it is trying to add "[" (which obviously isn't a number) to Num1. Hence the InvalidCastException.

Your code should read:

Return "[" & Num1 & "]"


This is done according to concept of lottery in wiki

Public Class LotteryNum

    'This class create a set of lottery numbers in one group. 
    'Rule #1: Each number is from 1 to 49. 
    'Rule #2: No duplicates. 
    'Rule #3: Not ordered.
    'Rule #4: In one group. (No Mega Ball number)
    'Reference: http://en.wikipedia.org/wiki/Lottery

    Private Shared rand As New Random
    Private m As Integer = 5
    Private LowLimit As Integer = 1
    Private HighLimit As Integer = 49
    Private mNums As List(Of Integer)

    Sub New()
        Dim n As Integer
        mNums = New List(Of Integer)
        Do While mNums.Count <= m
            n = LowLimit + rand.Next(HighLimit - LowLimit + 1)
            If Not (mNums.Contains(n)) Then
                mNums.Add(n)
            End If
        Loop
    End Sub

    Sub New(ByVal GivenNums As Integer())
        If (GivenNums.Length <> 6) Then
            MsgBox("Input Lottery must contain 6 numbers ")
            Exit Sub
        End If

        mNums = New List(Of Integer)
        For Each n As Integer In GivenNums
            mNums.Add(n)
        Next
    End Sub

    Public ReadOnly Property Nums() As List(Of Integer)
        Get
            Return mNums
        End Get
    End Property

    Public Overrides Function ToString() As String
        Dim str As New List(Of String)
        For Each n As Integer In Nums
            str.Add(n.ToString)
        Next
        Return String.Join(", ", str.ToArray)
    End Function
    Public Shared Operator =(ByVal Lot1 As LotteryNum, ByVal Lot2 As LotteryNum) As Boolean
        For Each n1 As Integer In Lot1.Nums
            If Not (Lot2.Nums.Contains(n1)) Then
                Return False
            End If
        Next
        Return True
    End Operator
    Public Shared Operator <>(ByVal Lot1 As LotteryNum, ByVal Lot2 As LotteryNum) As Boolean
        Return Not (Lot1 = Lot2)
    End Operator

End Class

Imports System.IO Module Module1

Sub Main()
    Dim lot1 As New LotteryNum
    Dim given As New LotteryNum(New Integer() {10, 18, 25, 33, 42, 7})
    Dim myNum As New LotteryNum(New Integer() {10, 25, 33, 42, 18, 7})
    Dim yourNum As New LotteryNum(New Integer() {10, 23, 33, 42, 18, 7})

    Console.WriteLine("The new lottery numbers are: {0}", lot1.ToString)
    Console.WriteLine("My lottery is the LOTTERY: {0}", (myNum = given))
    Console.WriteLine("Your lottery is the LOTTERY: {0}", (yourNum = given))

    'Generate 300 lotteries and write to file
    Dim str As New List(Of String)
    For i As Integer = 0 To 299
        str.Add((New LotteryNum).ToString)
    Next
    File.WriteAllLines("c:\temp\lottery.txt", str.ToArray)


    Console.ReadKey()

End Sub

End Module

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜