Así que estoy haciendo Deal or No Deal y actualmente estoy tratando de aleatorizar qué caso contiene qué cantidad de dinero. Por el momento, mi código crea la lista de valores y luego aleatoriza una selección que luego ingresa en la matriz. Luego envía a la consola los 26 valores. Ahora, cuando se selecciona un valor de la lista y se ingresa en la matriz, quiero que ese valor se elimine de la lista. Entonces, cuando el ciclo se repite y elige otro elemento de la lista, ya no puede seleccionar el que se eligió en el ciclo anterior.

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim i As Integer
    Dim values = New List(Of Integer)({0.5, 1, 2, 5, 10, 15, 25, 50, 80, 100, 500, 750, 1000, 2000, 5000, 10000, 25000, 50000, 80000, 100000, 150000, 250000, 500000, 850000, 1000000, 10000000})
    Dim sselect = New Random()
    Dim cases(25) As Integer

    For i = 0 To cases.Length - 1

        cases(i) = sselect.Next(0, values.Count)
        Console.WriteLine(values(cases(i)))
    Next

End Sub

Intenté usar RemoveAll y luego AddressOf para eliminar los valores duplicados, pero no parece funcionar.

        values.RemoveAll(AddressOf cases)
1
Zach 16 oct. 2018 a las 14:00

2 respuestas

La mejor respuesta

Puede hacer uso del RemoveAt al elegir los importes que:

Elimina el elemento en el índice especificado de la Lista.

Así:

For i = 0 To cases.Length - 1
    cases(i) = sselect.Next(0, values.Count)
    Console.WriteLine(values(cases(i)))
    values.RemoveAt(cases(i))
Next

El uso de esta forma eliminará el valor usado de la lista values en el acto, lo que a su vez no permitirá que se elijan valores duplicados.

Le sugiero que guarde una copia de la lista original antes de repetirla. Una forma rápida y sencilla es crear la lista dos veces al principio.

Dim values = New List(Of Integer)({0.5, 1, 2, 5, 10, 15, 25, 50, 80, 100, 500, 750, 1000, 2000, 5000, 10000, 25000, 50000, 80000, 100000, 150000, 250000, 500000, 850000, 1000000, 10000000})
Dim original = New List(Of Integer)({0.5, 1, 2, 5, 10, 15, 25, 50, 80, 100, 500, 750, 1000, 2000, 5000, 10000, 25000, 50000, 80000, 100000, 150000, 250000, 500000, 850000, 1000000, 10000000})

De esta manera después de eliminarlos todos de la lista values. Aún los tendrá en la lista original. Suponiendo que los reutilizará más adelante.

1
Paul Karam 16 oct. 2018 a las 11:30

Hay una mejor manera:

Dim rng As New Random
Dim cases = {0.5, 1, 2, 5, 10, 15, 25, 50, 80, 100, 500, 750, 1000, 2000, 5000, 10000, 25000, 50000, 80000, 100000, 150000, 250000, 500000, 850000, 1000000, 10000000}.OrderBy(Function(dbl) rng.NextDouble()).ToList()

¡Hecho! Por cierto, ¿cómo vas a almacenar 0.5 en un List(Of Integer)?

Editar:

En mi código original, el resultado final sería un IEnumerable(Of Double). Debería haber agregado una llamada a ToList para obtener un List(Of Double), que ahora agregué.

El código usa una matriz de tipo implícito y, debido a que hay un valor Double allí, se infiere que la matriz es de tipo Double. Todos los valores de Integer se convierten implícitamente a Doubles. Si desea un List(Of Decimal) en lugar de un List(Of Double), simplemente cambie 0.5, que es un Double literal, a 0.5D, que es un {{X9} } literal.

0
jmcilhinney 17 oct. 2018 a las 00:05