结论:30只以上为佳,3的倍数
https://www.bilibili.com/video/BV17nYVekEWU/?vd_source=9b97428fe30142d2bb4f9bab6ef082a4
# Import necessary libraries
import numpy as np
import random
from collections import defaultdict
import matplotlib.pyplot as plt# Function to initialize the game with a specified number of turtles with random colors
def initialize_game(n):colors = list(range(10)) # Define ten possible colors for the turtlesinitial_turtles = [random.choice(colors) for _ in range(n)] # Initialize turtles with random colorsreturn initial_turtles# Function to draw a turtle from the pool; may modify the pool if the lucky color is drawn
def draw_turtle(turtle_pool, lucky_color):if turtle_pool:# Randomly select and remove a turtle from the poolturtle = turtle_pool.pop(random.randint(0, len(turtle_pool) - 1))# If the turtle's color matches the lucky color, add a new random turtle to the poolif turtle == lucky_color:turtle_pool.append(random.choice(range(10)))return turtlereturn None# Function to fill a 3x3 grid with turtles from the pool
def fill_grid(turtle_pool, grid, lucky_color):for i in range(3):for j in range(3):# Only place a new turtle in empty grid spacesif grid[i][j] is None and turtle_pool:grid[i][j] = draw_turtle(turtle_pool, lucky_color)# Function to check for three in a row or column and update the grid accordingly
def check_and_update_grid(grid, turtle_pool, lucky_color):to_remove = []three_in_a_row_count = 0two_in_a_row_count = 0# Check for three in a row/columnfor i in range(3):if grid[i][0] is not None and grid[i][0] == grid[i][1] == grid[i][2]:to_remove.extend([(i, 0), (i, 1), (i, 2)])three_in_a_row_count += 1for j in range(3):if grid[0][j] is not None and grid[0][j] == grid[1][j] == grid[2][j]:to_remove.extend([(0, j), (1, j), (2, j)])three_in_a_row_count += 1# Remove turtles from the gridfor i, j in to_remove:grid[i][j] = None# Refill turtle pool if three in a row were foundif to_remove:for _ in range(5 * three_in_a_row_count):turtle_pool.append(random.choice(range(10)))# Check for two in a row/column and clear thempairs = []for i in range(3):for j in range(3):if grid[i][j] is not None:for x in range(i, 3):for y in range(3):if (i != x or j != y) and grid[i][j] == grid[x][y]:pairs.append((i, j, x, y))# Remove pairs of turtles from the gridif pairs:i, j, x, y = pairs[0]grid[i][j] = Nonegrid[x][y] = Noneturtle_pool.append(random.choice(range(10)))two_in_a_row_count += 1# Check if all grid colors are differentcolors_in_grid = set()all_different = Truefor i in range(3):for j in range(3):if grid[i][j] is not None:if grid[i][j] in colors_in_grid:all_different = Falsecolors_in_grid.add(grid[i][j])else:all_different = False# Clear the grid if all colors are different and reward with more turtlesif all_different:for i in range(3):for j in range(3):grid[i][j] = Nonefor _ in range(5):turtle_pool.append(random.choice(range(10)))return (three_in_a_row_count, two_in_a_row_count, all_different)# Function to determine if there are any pairs of turtles left in the grid
def grid_has_pairs(grid):"""Check if there are any removable groups of turtles in the grid"""for i in range(3):if grid[i][0] is not None and grid[i][0] == grid[i][1] == grid[i][2]:return Truefor j in range(3):if grid[0][j] is not None and grid[0][j] == grid[1][j] == grid[2][j]:return Truefor i in range(3):for j in range(3):if grid[i][j] is not None:for x in range(i, 3):for y in range(3):if (i != x or j != y) and grid[i][j] == grid[x][y]:return Truereturn False# Main function to simulate the gameplay
def play_game(n, lucky_color):turtle_pool = initialize_game(n)grid = [[None for _ in range(3)] for _ in range(3)]total_draws = nthree_in_a_row_count = 0two_in_a_row_count = 0lucky_turtle_draws = 0all_different_count = 0# Continue game while there are moves leftwhile turtle_pool or grid_has_pairs(grid):fill_grid(turtle_pool, grid, lucky_color)# Check grid and update it while there are matcheswhile True:three_count, two_count, all_different = check_and_update_grid(grid, turtle_pool, lucky_color)if three_count == 0 and two_count == 0 and not all_different:breakthree_in_a_row_count += three_counttwo_in_a_row_count += two_countif all_different:all_different_count += 1# Check for and count lucky color drawsfor row in grid:for turtle in row:if turtle == lucky_color:lucky_turtle_draws += 1# Calculate total number of drawstotal_draws = n + lucky_turtle_draws + two_in_a_row_count + 5 * three_in_a_row_count + 5 * all_different_countreturn total_draws# Simulation function to run multiple trials and analyze results
def run_simulation(trials, n):results = []lucky_color = random.choice(range(10))for _ in range(trials):m = play_game(n, lucky_color)results.append(m)return np.array(results)# Main function to conduct simulations and plot results
def main():n_list=[]m_mean_list=[]m_variance_list=[]m_mean_div_n_list=[]trials = 10000for n in range(1, 11, 1):results = run_simulation(trials, n)mean = np.mean(results)variance = np.var(results)distribution = dict(zip(*np.unique(results, return_counts=True)))print(f'n = {n}:')print(f' Mean = {mean}')print(f' Variance = {variance}')print(f' Probability Distribution = {distribution}\n')n_list.append(n)m_mean_list.append(mean)m_variance_list.append(variance) m_mean_div_n_list.append(mean/n)plt.plot(n_list, m_mean_list)plt.plot(n_list, m_variance_list)plt.plot(n_list, m_mean_div_n_list)# Check if the script is the main program and run it
if __name__ == "__main__":main()