Project 1: The Game of Hog--Problem 9 (2 pt)问题

问题9

Implement max_scoring_num_rolls, which runs an experiment to determine the number of rolls (from 1 to 10) that gives the maximum average score for a turn. Your implementation should use make_averaged and roll_dice.

If two numbers of rolls are tied for the maximum average score, return the lower number. For example, if both 3 and 6 achieve a maximum average score, return 3.

You might find it useful to read the doctest and the example shown in the doctest for this problem before doing the unlocking test.

Important: In order to pass all of our tests, please make sure that you are testing dice rolls starting from 1 going up to 10, rather than from 10 to 1.

函数原型描述:

def max_scoring_num_rolls(dice=six_sided, samples_count=1000):
    """Return the number of dice (1 to 10) that gives the highest average turn score
    by calling roll_dice with the provided DICE a total of SAMPLES_COUNT times.
    Assume that the dice always return positive outcomes.

    >>> dice = make_test_dice(1, 6)
    >>> max_scoring_num_rolls(dice)
    1
    """
    # BEGIN PROBLEM 9
    "*** YOUR CODE HERE ***"
    # END PROBLEM 9

分析

这个函数想实现:给定一个dice(),然后确定这个骰子扔多少个(num_rolls)才能在函数make_averaged()中获取最大平均值。

在这举个例子,看下函数roll_dice(num_rolls, dice)以相同的点数策略dice(),但是在不同的骰子数量num_rolls的影响下,产生的结果。这里先固定下dice()函数的策略:

>>> dice = make_test_dice(3, 1, 5, 6)

然后看下roll_dice(num_rolls, dice)在不同的骰子数量num_rolls的影响下(这里仅举1、2、3数量,其他数量可以自行推算💦),产生的结果:

  1. num_rolls = 1:反复调用roll_dice()函数,省略各个骰子的结果,可以得到分数分别为:3、1、5、6。各个结果的概率均为1/4。
  2. num_rolls = 2:反复调用roll_dice()函数,省略各个骰子的结果,分数分别为1、11。得到每个结果的概率为1/2
  3. num_rolls = 3:反复调用roll_dice()函数,骰子的结果分别为:3,1,56,3,15,6,31,5,63,1,5...这是4个得分循环,每次得分分别为:1、1、14、1。各个结果的概率均为1/4。

这个例子说明,函数roll_dice(num_rolls, dice)在相同的点数策略dice(),而在不同的骰子数量num_rolls的影响下,重复调用会出现完全不一致的结果。这样就会导致函数make_averaged()在选用相同点数策略但是不同骰子数量roll_dice()时候,得到的结果不一致。

所以要确定:函数roll_dice(num_rolls, dice)以相同的点数策略dice(),但是以多少骰子数量num_rolls才能在函数make_averaged()获取到较大的平均值。

实现

def max_scoring_num_rolls(dice=six_sided, samples_count=1000):
    """Return the number of dice (1 to 10) that gives the highest average turn score
    by calling roll_dice with the provided DICE a total of SAMPLES_COUNT times.
    Assume that the dice always return positive outcomes.

    >>> dice = make_test_dice(1, 6)
    >>> max_scoring_num_rolls(dice)
    1
    """
    # BEGIN PROBLEM 9
    "*** YOUR CODE HERE ***"
    i = num_rolls = 1
    higher_avg_score = 0
    while i <= 10:
        avg_score = make_averaged(roll_dice, samples_count)(i, dice)
        if avg_score > higher_avg_score:
            higher_avg_score = avg_score
            num_rolls = i
        i += 1
    return num_rolls
    # END PROBLEM 9

这样便通过了。

posted @ 2024-02-20 08:55  上山砍大树  阅读(126)  评论(0)    收藏  举报