Aquí está el problema:

Usted va a escribir un programa para simular el balanceo de un par de dados.

  • Se le pregunta al usuario por el número de rollos a simular. Luego va a rodar dos dados por rollo. El uso de la biblioteca al azar y la función randint en el mismo (al azar.randint(1,6)) para cada uno de los dados.

  • Sumar los números de cada uno de los dados, y mantener un recuento de cada una de las posibles rollo (2-12), y cuántas veces rollo de «dobles» (el mismo número en ambos dados).

  • Imprimir cada uno de los dados recuento, el número de rollos para que la cuenta del dado, y el porcentaje del total:

    Ejemplo De Salida

    Introduzca el número de rollos de papel: 10000

    2 – 266 2.660000%

    3 – 580 5.800000%

    4 – 881 8.810000%

    5 – 1086 10.860000%

    6 – 1418 14.180000%

    7 – 1658 16.580000%

    8 – 1363 13.630000%

    9 – 1096 10.960000%

    10 – 829 8.290000%

    11 – 550 5.500000%

    12 – 273 2.730000%

    Dobles – 1425 – 14.234000%

Aquí está mi código:

import random

def dice_roll():
    return random.randint(1,6)

count = int(input("Enter the number of rolls: "))
number_of_double_dice = 0
results = [0 for x in range(13)]


for i in range(0,count):
    first = dice_roll()
    second = dice_roll()
    sum = first + second

    if(first == second):
        number_of_double_dice = number_of_double_dice + 1
        results[sum] = results[sum] + 1


for x in range (2,13):
    print("{0:d} - {1:d}{2:0.4f}%".format(x, results[x], results[x]/count*100))
    print("Doubles- {0:d}-{{1:0.6f}%".format(number_of_double_dice,       number_of_double_dice*100))

main()

Sin embargo, mi código no funciona. ¿Alguien puede decirme por qué? Sigo recibiendo ValueError mensajes.

EDITAR
Puedo Ejecutar el programa, y esto es lo que obtengo:
Introduzca el número de rollos de papel: 10000

2 – 2772.7700%

Dobles – 1667-166700.0000%

3 – 00.0000%

Dobles – 1667-166700.0000%

4 – 2502.5000%

Dobles – 1667-166700.0000%

5 – 00.0000%

Dobles – 1667-166700.0000%

6 – 2982.9800%

Dobles – 1667-166700.0000%

7 – 00.0000%

Dobles – 1667-166700.0000%

8 – 2732.7300%

Dobles – 1667-166700.0000%

9 – 00.0000%

Dobles – 1667-166700.0000%

10 – 2782.7800%

Dobles – 1667-166700.0000%

11 – 00.0000%

Dobles – 1667-166700.0000%

12 – 2912.9100%

Dobles – 1667-166700.0000%

Esto no es ni siquiera cerca de parecer lo que los resultados de la muestra dice que debo tener. ¿Qué estoy haciendo mal?

  • El doble corchete de apertura {{1:0.6 f}% debe ser una sola.
  • Donde es el ValueError planteado? También, la llamada a main() levantaría un NameError a menos que realmente la define.
InformationsquelleAutor Kjc21793 | 2014-05-11

3 Comentarios

  1. 0

    Hay 4 cambios necesarios para hacer que el código de trabajo (aparte de que el menor de los errores tipográficos ya se ha mencionado en los comentarios):

    En primer lugar, sólo añadir 1 a results[sum] si first == second. Así, results[sum] = results[sum] + 1 no debe estar bajo el if statement:

    if(first == second):
        number_of_double_dice = number_of_double_dice + 1
    
    results[sum] = results[sum] + 1

    En segundo lugar, por alguna razón que yo todavía no sé qué, "{0:d} - {1:d}{2:0.4f}%" debe ser cambiado a "{0:d} - {1:d} {2:0.4f}%" (observe el espacio entre la segunda } y la tercera {).

    En tercer lugar, a la hora de calcular el porcentaje del total para el número de dobles, que se han olvidado de dividir por count. Por lo tanto, deben ser:

    print("Doubles- {0:d}-{1:0.6f}%".format(number_of_double_dice,       number_of_double_dice/count*100))

    En cuarto lugar, la línea en la que se imprime el número de dobles necesita ser puesta fuera de la for statement debido a que usted sólo desea imprimir una vez; no en cada iteración de la for statement:

    for x in range (2,13):
        print "{0:d} - {1:d} {2:0.4f}%".format(x, results[x], results[x] / count * 100)
    
    print("Doubles- {0:d}-{1:0.6f}%".format(number_of_double_dice, number_of_double_dice / count *100))

    Así que el código debe ser similar este: https://gist.github.com/s16h/b4c2bc791880b61418b2.

    Yo rápidamente se han re-escrito su programa, he tratado de mantener la lógica y la manera de hacer las cosas:

    from __future__ import division
    import random
    import sys
    
    def dice_roll():
        return random.randint(1, 6)
    
    def number_of_rolls():
        return int(raw_input('Enter the number of rolls: '))
    
    def simulate(number_of_times):
        counter = {n : 0 for n in range(2, 13)}
        doubles = 0
    
        for i in range(number_of_times):
            first_dice = dice_roll()
            second_dice = dice_roll()
            total = first_dice + second_dice
    
            doubles += 0 if first_dice != second_dice else 1
            counter[total] += 1
    
        return counter, doubles
    
    def main():
        rolls = number_of_rolls()
        counter, doubles = simulate(rolls)  
        total = sum(counter.values())
    
        for total, count in counter.items():
            print("{} - {} {:0.4f}%".format(total, count, count / rolls * 100))
    
        print("Doubles - {} - {:0.6f}%".format(doubles, doubles / rolls * 100))
    
    if __name__ == '__main__':
        sys.exit(main())

    Espero que esto ayude.

    • Incluso con ese fix, me da el mismo formato de los resultados, aunque con diferentes números, debido a la azar de la biblioteca.
    • Imprimir el número de dobles no debe estar en la for statement; sólo desea imprimir de una vez, al final; no en cada iteración de la for statement.
    • Por lo general, una lista no es la mejor (es decir, la más legible) manera de representar este problema; creo que es un diccionario más adecuado.
    • Que el programa funciona. ¿Cuál fue la diferencia entre el tuyo y el mío? Quiero decir, lo que no estoy haciendo correctamente que fueron?
    • He actualizado la respuesta, quiero saber si eso le ayuda.
    • Las matemáticas parece apagado. Por ejemplo, si entro un rollo como una entrada, me va a dar los datos para 2 rollos.
    • Mejor ahora? Editado range(number_of_times + 1) a range(number_of_times). Lo siento!
    • Sí, muchas gracias!

  2. 0

    Aquí es una mejor versión de su código:

    import random
    
    num = int(input('How many rolls do you want to simulate? '))
    
    rolls = {}
    for k in range(2, 13):
            rolls[k] = 0
    
    doubles = 0
    
    for k in range(num):
            first = random.randint(1, 6)
            second = random.randint(1, 6)
            if first == second:
                    doubles+=1
            rolls[first+second]+=1
    
    for k in rolls:
            print('%d - %d %f%%' %(k, rolls[k], float(rolls[k])/float(num)*100))
    
    print('Doubles - %d - %f%%' %(doubles, float(doubles)/float(num)))

    Este se ejecuta como:

    How many rolls do you want to simulate? 10000
    2 - 286 2.860000%
    3 - 571 5.710000%
    4 - 788 7.880000%
    5 - 1066 10.660000%
    6 - 1393 13.930000%
    7 - 1731 17.310000%
    8 - 1470 14.700000%
    9 - 1034 10.340000%
    10 - 840 8.400000%
    11 - 541 5.410000%
    12 - 280 2.800000%
    Doubles - 1669 - 0.166900%

    Su problema era que tenía sólo añadiendo uno a la suma si no se duplica, que fue la razón por la que sólo había resultados incluso en rollos. También había {{1:0.6f}% que debería haber sido {1:0.6f}%.

    • Mejor usar str.format() en vez de printf-style String Formatting.
    • «También se multiplica por 100, en lugar de dividir por 100»? Se están multiplicando por 100 demasiado; lo cual es correcto.
    • Que me da un error de sintaxis no válida.
    • Usted puede publicar el total de la trazabilidad?
    • Oh, estás usando python3… un segundo, me dejaba actualizar

Dejar respuesta

Please enter your comment!
Please enter your name here