4.2 Παραγωγή Τυχαίων Αριθμών για Προσομοίωση και Παιχνίδια

Η παραγωγή τυχαίων αριθμών είναι ένα σημαντικό στοιχείο σε πολλές εφαρμογές προγραμματισμού, όπως στις προσομοιώσεις και τα παιχνίδια. Στην Python, μπορείτε να χρησιμοποιήσετε την ενσωματωμένη βιβλιοθήκη random για να παράγετε τυχαίους αριθμούς.

Παραγωγή Τυχαίων Αριθμών για το Ρίξιμο Ενός Εξάπλευρου Ζαριού

Για να προσομοιώσετε το ρίξιμο ενός εξάπλευρου ζαριού, μπορείτε να παράγετε τυχαίους ακέραιους αριθμούς στο εύρος από 1 έως 6. Ας δούμε πώς μπορείτε να παράγετε 10 τυχαίους αριθμούς για τον σκοπό αυτό:

Παράδειγμα Κώδικα

import random

# Παραγωγή 10 τυχαίων αριθμών για το ρίξιμο ενός εξάπλευρου ζαριού
for roll in range(10):
    number = random.randint(1, 6)
    print(number)

Στο παράδειγμα αυτό, η συνάρτηση randint της βιβλιοθήκης random χρησιμοποιείται για να παράγει έναν τυχαίο αριθμό ανάμεσα στο 1 και το 6. Η εντολή επανάληψης for εκτελείται 10 φορές, παράγοντας και εκτυπώνοντας έναν τυχαίο αριθμό κάθε φορά.

Σημασία της Παραγωγής Τυχαίων Αριθμών

Η παραγωγή τυχαίων αριθμών είναι χρήσιμη σε πολλές εφαρμογές, όπως παιχνίδια, προσομοιώσεις, και ακόμα και σε εφαρμογές που αφορούν ασφάλεια και κρυπτογραφία. Η βιβλιοθήκη random της Python παρέχει μια σειρά από λειτουργίες για την εύκολη παραγωγή τυχαίων τιμών σε διάφορες μορφές και εύρη.

Χρήση της Συνάρτησης randrange της Βιβλιοθήκης random στην Python

Η βιβλιοθήκη random της Python προσφέρει διάφορες λειτουργίες για την παραγωγή τυχαίων αριθμών, μία από τις οποίες είναι η συνάρτηση randrange. Αυτή η συνάρτηση χρησιμοποιείται για την παραγωγή ενός τυχαίου ακεραίου αριθμού εντός ενός καθορισμένου εύρους.

Χρήση της randrange

Για να χρησιμοποιήσετε την randrange, πρώτα εισάγετε την βιβλιοθήκη random:

import random

Στη συνέχεια, μπορείτε να καλέσετε την randrange για να παράγετε τυχαίους ακεραίους. Η randrange δέχεται τουλάχιστον ένα όρισμα και επιστρέφει έναν τυχαίο αριθμό εντός του εύρους που καθορίζεται από τα ορίσματα:

  • randrange(stop): Παράγει έναν αριθμό από το 0 έως stop - 1.
  • randrange(start, stop): Παράγει έναν αριθμό από το start έως stop - 1.
  • randrange(start, stop, step): Παράγει έναν αριθμό από το start έως stop - 1, αυξανόμενο με βήματα step.

Παράδειγμα Χρήσης της randrange

for _ in range(10):
    number = random.randrange(1, 7)  # Παράγει αριθμούς από 1 έως 6
    print(number)

Εξασφάλιση Επαναληψιμότητας Τυχαίων Ακολουθιών

Για να εξασφαλίσετε ότι μια τυχαία ακολουθία μπορεί να παραχθεί επαναλαμβανόμενα (π.χ., για αποσφαλμάτωση), μπορείτε να χρησιμοποιήσετε τη συνάρτηση seed της βιβλιοθήκης random. Η seed ορίζει την αρχική τιμή για την παραγωγή τυχαίων αριθμών, εξασφαλίζοντας έτσι ότι η ίδια ακολουθία αριθμών θα παραχθεί κάθε φορά που τρέχει το πρόγραμμα με την ίδια τιμή seed.

Παράδειγμα Χρήσης της seed

random.seed(0)  # Ορίζει την αρχική τιμή για την παραγωγή τυχαίων αριθμών

for _ in range(10):
    number = random.randrange(1, 7)
    print(number)

Με την ίδια τιμή seed, η ακολουθία των τυχαίων αριθμών θα είναι η ίδια κάθε φορά που τρέχετε τον παραπάνω κώδικα.

Προσομοίωση Ρίξης Ενός Εξάπλευρου Ζαριού 13,000,000 Φορές

Αν η συνάρτηση randrange παράγει πραγματικά τυχαίους αριθμούς, τότε κάθε αριθμός στο εύρος της θα έχει ίση πιθανότητα εμφάνισης κάθε φορά που καλείται. Για να δείξουμε ότι οι επιφάνειες του ζαριού από το 1 έως το 6 εμφανίζονται με ίση πιθανότητα, μπορούμε να προσομοιώσουμε 13,000,000 ρίψεις ζαριού. Κάθε επιφάνεια του ζαριού θα πρέπει να εμφανίζεται περίπου 2,166,667 φορές στις 13,000,000 ρίψεις.

Παράδειγμα Προσομοίωσης Ρίξης Ζαριού

import random

# Αρχικοποίηση μετρητών για κάθε επιφάνεια του ζαριού
die_counts = [0, 0, 0, 0, 0, 0]

# Προσομοίωση 13,000,000 ρίψεων ζαριού
for roll in range(13000000):
    face = random.randrange(1, 7)
    die_counts[face - 1] += 1

# Εμφάνιση των αποτελεσμάτων
for i, count in enumerate(die_counts, start=1):
    print(f"Επιφάνεια {i}: {count} φορές")

Ερμηνεία του Παραδείγματος

Στο παράδειγμα αυτό, δημιουργούμε μια λίστα die_counts με έξι στοιχεία, ένα για κάθε επιφάνεια του ζαριού, για να καταγράφουμε πόσες φορές εμφανίζεται κάθε αριθμός. Στη συνέχεια, προσομοιώνουμε 13,000,000 ρίψεις ζαριού, αυξάνοντας τον αντίστοιχο μετρητή κάθε φορά που εμφανίζεται μια επιφάνεια. Τέλος, εμφανίζουμε τον αριθμό των εμφανίσεων για κάθε επιφάνεια.

Η έξοδος αυτής της προσομοίωσης θα δείξει αν η randrange δημιουργεί πραγματικά τυχαίους αριθμούς με ίση πιθανότητα για κάθε αριθμό, όπως θα περιμέναμε από ένα δίκαιο ζάρι.

Ορισμός Σπόρου (Seed) για τον Παραγωγό Τυχαίων Αριθμών για Επαναληψιμότητα

Όταν χρησιμοποιείτε τυχαίους αριθμούς στα προγράμματά σας, ειδικά κατά τη διάρκεια της αποσφαλμάτωσης, είναι συχνά χρήσιμο να μπορείτε να παράγετε την ίδια ακολουθία τυχαίων αριθμών κάθε φορά που τρέχετε τον κώδικά σας. Αυτό είναι δυνατό με τη χρήση της συνάρτησης seed της βιβλιοθήκης random.

Ορισμός Σπόρου για Επαναληψιμότητα

Η συνάρτηση seed αρχικοποιεί τον παραγωγό τυχαίων αριθμών (random-number generator) με έναν συγκεκριμένο αριθμό, γνωστό ως σπόρος (seed). Όταν ορίζετε έναν σπόρο, η ακολουθία των τυχαίων αριθμών που παράγεται από τον παραγωγό θα είναι η ίδια κάθε φορά που τρέχετε τον κώδικά σας με τον ίδιο σπόρο.

Παράδειγμα Ορισμού Σπόρου

import random

random.seed(0)  # Ορισμός του σπόρου

# Παραγωγή μιας ακολουθίας τυχαίων αριθμών
for _ in range(5):
    print(random.randrange(1, 100))

Με την παραπάνω προσέγγιση, ο παραγωγός τυχαίων αριθμών θα παράγει την ίδια ακολουθία αριθμών κάθε φορά που τρέχετε το πρόγραμμα με τον ίδιο σπόρο. Αυτό είναι ιδιαίτερα χρήσιμο για την αποσφαλμάτωση προγραμμάτων που βασίζονται σε τυχαία δεδομένα, καθώς επιτρέπει την επανάληψη και τη δοκιμή του κώδικα με συγκεκριμένη ακολουθία δεδομένων.

Περίπτωση Μελέτης: Προσομοίωση του Παιχνιδιού των Ζαριών “Craps”

Το “craps” είναι ένα δημοφιλές παιχνίδι με ζάρια που συνδυάζει την τύχη και τη στρατηγική. Ας δούμε πώς μπορούμε να προσομοιώσουμε αυτό το παιχνίδι χρησιμοποιώντας Python.

Κανόνες του Παιχνιδιού Craps

Πρώτη Ρίψη (Come Out Roll): Ρίχνετε δύο εξάπλευρα ζάρια.

  • Αν το άθροισμα είναι 7 ή 11, κερδίζετε.
  • Αν το άθροισμα είναι 2, 3 ή 12, χάνετε (αυτό αποκαλείται “craps”).
  • Για οποιοδήποτε άλλο άθροισμα (4, 5, 6, 8, 9, 10), το άθροισμα γίνεται το “point” σας.

Συνέχεια του Παιχνιδιού: Συνεχίζετε να ρίχνετε τα ζάρια μέχρι να:

  • Ρίξετε ξανά το “point” σας, και κερδίζετε.
  • Ρίξετε ένα 7 πριν από το “point” σας, και χάνετε.

Παράδειγμα Σεναρίου Προσομοίωσης

import random

def roll_dice():
    """Ρίχνει δύο ζάρια και επιστρέφει το άθροισμά τους."""
    return random.randint(1, 6) + random.randint(1, 6)

def play_craps():
    """Παίζει ένα γύρο του παιχνιδιού craps."""
    point = roll_dice()
    print(f"Ρίξατε {point}")

    # Κανόνες για την πρώτη ρίψη
    if point in (7, 11):
        return "Κερδίσατε!"
    elif point in (2, 3, 12):
        return "Craps, χάσατε."
    else:
        # Συνέχεια του παιχνιδιού
        print(f"Το point σας είναι {point}. Προσπαθήστε να το ρίξετε ξανά πριν το 7!")
        while True:
            roll = roll_dice()
            print(f"Ρίξατε {roll}")
            if roll == point:
                return "Κερδίσατε!"
            elif roll == 7:
                return "Χάσατε."

# Παίξτε το παιχνίδι
result = play_craps()
print(result)

Σε αυτό το σενάριο, η συνάρτηση play_craps προσομοιώνει ένα γύρο του παιχνιδιού craps. Αρχικά, ρίχνει τα ζάρια και ελέγχει το αποτέλεσμα βάσει των κανόνων του παιχνιδιού. Αν το παιχνίδι συνεχιστεί μετά την πρώτη ρίψη, ρίχνει τα ζάρια επαναληπτικά μέχρι να καθοριστεί ο νικητής ή ο ηττημένος.

Ας ερμηνεύσουμε βήμα προς βήμα το παράδειγμα της προσομοίωσης του παιχνιδιού craps:

Εισαγωγή Βιβλιοθήκης

import random

Εδώ εισάγουμε την βιβλιοθήκη random της Python, η οποία παρέχει τις λειτουργίες για την παραγωγή τυχαίων αριθμών.

Ορισμός της Συνάρτησης για τη Ρίψη των Ζαριών

def roll_dice():
    """Ρίχνει δύο ζάρια και επιστρέφει το άθροισμά τους."""
    return random.randint(1, 6) + random.randint(1, 6)

Η roll_dice είναι μια συνάρτηση που προσομοιώνει τη ρίψη δύο εξάπλευρων ζαριών. Χρησιμοποιεί τη συνάρτηση randint της βιβλιοθήκης random για να παράγει δύο τυχαίους αριθμούς από το 1 έως το 6 (που αντιστοιχούν στις επιφάνειες των ζαριών) και επιστρέφει το άθροισμά τους.

Ορισμός της Συνάρτησης για το Παιχνίδι Craps

def play_craps():
    """Παίζει ένα γύρο του παιχνιδιού craps."""
    point = roll_dice()
    print(f"Ρίξατε {point}")

Αυτή η συνάρτηση ξεκινά το παιχνίδι craps ρίχνοντας τα ζάρια με τη συνάρτηση roll_dice και αποθηκεύοντας το αποτέλεσμα στη μεταβλητή point. Στη συνέχεια, εκτυπώνει το αποτέλεσμα της πρώτης ρίψης.

if point in (7, 11):
    return "Κερδίσατε!"
elif point in (2, 3, 12):
    return "Craps, χάσατε."

Εδώ, η συνάρτηση ελέγχει το αποτέλεσμα της πρώτης ρίψης:

  • Αν το άθροισμα είναι 7 ή 11, ο παίκτης κερδίζει αμέσως.
  • Αν το άθροισμα είναι 2, 3 ή 12, ο παίκτης χάνει αμέσως (αυτό αποκαλείται “craps”).
else:
    print(f"Το point σας είναι {point}. Προσπαθήστε να το ρίξετε ξανά πριν το 7!")
    while True:
        roll = roll_dice()
        print(f"Ρίξατε {roll}")
        if roll == point:
            return "Κερδίσατε!"
        elif roll == 7:
            return "Χάσατε."

Αν το άθροισμα είναι οποιοδήποτε άλλο (4, 5, 6, 8, 9, 10), αυτό γίνεται το “point” του παίκτη. Ο παίκτης συνεχίζει να ρίχνει τα ζάρια μέχρι να επαναλάβει το “point” και να κερδίσει ή να ρίξει ένα 7 και να χάσει.

Εκτέλεση του Παιχνιδιού

result = play_craps()
print(result)

Τέλος, τρέχουμε τη συνάρτηση play_craps για να παίξουμε ένα γύρο του παιχνιδιού και εκτυπώνουμε το αποτέλεσμα.

Αυτός ο κώδικας προσομοιώνει έναν πλήρη γύρο του παιχνιδιού craps, αποδεικνύοντας τις δυνατότητες της Python για την ανάπτυξη απλών παιχνιδιών και προσομοιώσεων.

10 Ιανουαρίου, 2024
top
error: Content is protected !!
Μετάβαση σε γραμμή εργαλείων