Math 避免随机生成减法问题中的偏差
我正在编写一个Python脚本来生成心算练习的问题。加法和乘法很容易,但我在尝试为减法生成无偏问题时遇到了麻烦 我希望能够指定最小值和最大值,最小值(第一个数字)将是——例如,对于两位数减法,它应该在20和99之间。subtrahand还应该有一个范围选项(比如11-99)。答案必须是肯定的,并且最好在这种情况下至少有10个范围 因此:Math 避免随机生成减法问题中的偏差,math,python-2.7,random,Math,Python 2.7,Random,我正在编写一个Python脚本来生成心算练习的问题。加法和乘法很容易,但我在尝试为减法生成无偏问题时遇到了麻烦 我希望能够指定最小值和最大值,最小值(第一个数字)将是——例如,对于两位数减法,它应该在20和99之间。subtrahand还应该有一个范围选项(比如11-99)。答案必须是肯定的,并且最好在这种情况下至少有10个范围 因此: 20分钟=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 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
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,似乎描述和代码之间存在矛盾哎呀,我从一位数减法函数中复制了一半参数。修正。这实际上不会在问题空间中产生均匀分布。低分钟数的问题将被过度呈现。是的,很抱歉值错误--请参阅我的编辑,我无意中从程序的另一部分复制了一半。谢谢!目前我已经介绍了放弃方法,但我对理解计算它的完整方法感兴趣,所以稍后我将查看完整的代码。我实际上是在考虑分钟数在其可能值上的均匀分布,而不关心其他值,但经过思考,我认为这实际上更合适。