Math 避免随机生成减法问题中的偏差

Math 避免随机生成减法问题中的偏差,math,python-2.7,random,Math,Python 2.7,Random,我正在编写一个Python脚本来生成心算练习的问题。加法和乘法很容易,但我在尝试为减法生成无偏问题时遇到了麻烦 我希望能够指定最小值和最大值,最小值(第一个数字)将是——例如,对于两位数减法,它应该在20和99之间。subtrahand还应该有一个范围选项(比如11-99)。答案必须是肯定的,并且最好在这种情况下至少有10个范围 因此: 20分钟=10还是答案

我正在编写一个Python脚本来生成心算练习的问题。加法和乘法很容易,但我在尝试为减法生成无偏问题时遇到了麻烦

我希望能够指定最小值和最大值,最小值(第一个数字)将是——例如,对于两位数减法,它应该在20和99之间。subtrahand还应该有一个范围选项(比如11-99)。答案必须是肯定的,并且最好在这种情况下至少有10个范围

因此:

  • 20分钟<99分钟
  • 11
  • 答案=分钟数-微秒数
  • 答案>=10
当然,所有的数值都应该用作变量

我已满足以下条件:

ansMin, ansMax = 10, 99
subtrahendMin, minuendMax = 11,99
# the other max and min did not seem to be necessary here,
# and two ranges was the way I had the program set up

answer = randint(ansMin, ansMax)
subtrahend = randint(subtrahendMin, minuendMax - answer)
minuend = answer + subtrahend # rearranged subtraction equation
这里的问题是,minuted值几乎都超过50,因为答案和subtrahand是首先生成并加在一起的,只有同时位于范围底部25%的部分才会得到低于50%的结果。(编辑:严格来说,这不是真的——例如,底部1%加上底部49%就行了,不管怎样,百分比是一种不好的描述方式,但我认为这个想法很清楚。)

我还考虑过尝试完全随机地生成minuted和subtrahand值,然后如果答案不符合标准(即,minuted大于subtrahand的值至少大于answerMin,并且它们都在上面列出的标准范围内),则抛出答案,但我认为这会导致类似的偏见


我不在乎它是否完美,但这太遥远了。我希望minuted值在允许的范围内是完全随机的,subtrawend值在minuted允许的范围内是随机的(如果我想得对,这将偏向于较低的值)。我不认为我真的关心答案的分布(只要它不是荒谬的偏见)。有更好的计算方法吗?

我可以看到你的起始值有几个问题-如果你希望答案总是大于10-那么你需要增加minutedmin,或者减少SubtrahendMin,因为20-11小于10。。。此外,您还将答案最小值和最大值定义为3,9-这意味着答案永远不会超过10

除此之外,我还通过先选择MinEnd值,然后根据它和answerMin选择subtrahend值,获得了一个很好的均匀分布值:

ansMin = 10
minuendMin, minuendMax = 20,99
subtrahendMin = 9;

minuend = randint(minuendMin, minuendMax )
subtrahend = randint(subtrahendMin,(minuend-ansMin) ) 
answer = minuend - subtrahend

在这种情况下,有几种方法可以定义“无偏见”的含义。我假设你正在寻找的是,从允许的问题空间中,以相同的概率选择每个可能的减法问题。快速和肮脏的方法:

  • 在[x_最小值,x_最大值]中随机选取x
  • 在[y_最小值,y_最大值]中随机选取y
  • 如果x-y 请注意粗体部分。如果你只丢弃y而保留x,你的问题将在x中均匀分布,而不是在整个问题空间中。您需要确保每个有效的x至少有一个有效的y-对于您最初选择的范围,情况并非如此,我们将在后面看到

    现在是一个长期的、正确的方法。首先,我们需要找出问题空间的实际大小

    允许的减数集由分钟数决定:

    x in [21, 99]
    y in [11, x-10]
    
    或使用符号常量:

    x in [x_min, x_max]
    y in [y_min, x - answer_min]
    
    我们可以把它改写为

    x in [21, 99]
    y = 11 + a
    a in [0, x-21]
    
    或者再次使用符号常量

    x in [x_min, x_max]
    y = y_min + a
    a in [0, x - (answer_min + y_min)].
    
    从这一点上,我们可以看到有效的问题只存在于x>=(answer_min+y_min),对于给定的x,有x-(answer_min+y_min)+1个可能的子数

    现在,我们假设x_max不施加任何进一步的约束,例如,答案_min+y_min>=0:

    x in [21, 99], number of problems:
        (99 - 21 + 1) * (1 + 78+1) / 2
    x in [x_min, x_max], number of problems:
        (x_max - x_min + 1) * (1 + x_max - (answer_min + y_min) + 1) / 2
    
    以上是使用算术序列和的公式得到的。因此,您需要在[14740]范围内选择一个随机数。要将这个数字转换为减法问题,我们需要定义问题空间和整数之间的映射。映射示例如下所示:

    ansMin, ansMax = 10, 99
    subtrahendMin, minuendMax = 11,99
    # the other max and min did not seem to be necessary here,
    # and two ranges was the way I had the program set up
    
    answer = randint(ansMin, ansMax)
    subtrahend = randint(subtrahendMin, minuendMax - answer)
    minuend = answer + subtrahend # rearranged subtraction equation
    
    • 1 x=21,y=11
    • 2x=22,y=12
    • 3x=22,y=11
    • 4x=23,y=13
    • 5X=23,y=12
    • 6X=23,y=11
    等等。请注意,当超过一个三角形数字时,x跳1。为了从随机数r计算x和y,最好通过在预计算表中搜索,找到大于或等于r的最小三角形数t;把这个数字写成q*(q+1)/2。然后x=x_min+q-1和y=y_min+t-r

    完整程序:

    import random
    
    x_min, x_max = (21, 99)
    y_min = 11
    answer_min = 10
    
    triangles = [ (q*(q+1)/2, q) for q in range(1, x_max-x_min+2) ]
    upper = (x_max-x_min+1) * (1 + x_max - (answer_min + y_min) + 1) / 2
    
    for i in range(0, 20):
        r = 1 + random.randrange(0, upper)
        (t, q) = next(a for a in triangles if a[0] >= r)
        x = x_min + q - 1
        y = y_min + t - r
        print "%d - %d = ?" % (x, y)
    

    请注意,对于大多数问题(约75%),x将大于60。这是正确的,因为对于minuted的低值,subtrahand的允许值较少。

    您说您已经让加法正常工作了。假设您对加数/和有类似的限制,您可以重新排列因子,以便:

    minuend <= sum
    subtrahend <= first addend
    answer <= second addend
    

    min您希望答案>=10还是答案<10,似乎描述和代码之间存在矛盾哎呀,我从一位数减法函数中复制了一半参数。修正。这实际上不会在问题空间中产生均匀分布。低分钟数的问题将被过度呈现。是的,很抱歉值错误--请参阅我的编辑,我无意中从程序的另一部分复制了一半。谢谢!目前我已经介绍了放弃方法,但我对理解计算它的完整方法感兴趣,所以稍后我将查看完整的代码。我实际上是在考虑分钟数在其可能值上的均匀分布,而不关心其他值,但经过思考,我认为这实际上更合适。