我的问题基本上是,"如何获得特定范围内的某些随机值超过范围之外的随机值?"
请允许我证明我的意思:
如果我在大量的试验中,开始挑选各种各样的试验 来自 1-10 的随机数,我应该在 7-10 中看到更多数字 范围比 1-6 范围。
我尝试了几种方法,但我没有得到理想的结果。
function getAverage(i)
math.randomseed(os.time())
local sum = 0;
for j = 1,i do
sum = sum + (1-math.random()^3)*10
end
print(sum/i)
end
getAverage(500)
我一直只能获得7.5左右的数字,例如7.48和7.52。虽然这确实让我得到了我的范围内的数字,但我并不想要这么严格的一致性。
function getAverage(i)
math.randomseed(os.time())
local sum = 0;
for j = 1,i do
sum = sum + (math.random() > .3 and math.random(7,10) or math.random(1,6))
end
print(sum/i)
end
getAverage(500)
这个功能并不像我想要的那样工作。我主要获得 6.8 和 7.2 等数字,但是甚至没有接近 8 。
function getAverage(i)
math.randomseed(os.time())
local sum = 0;
for j = 1,i do
sum = sum + (((math.random(10) * 2)/1.2)^1.05) - math.random(1,3)
end
print(sum/i)
end
getAverage(500)
这个函数给了我稍微有利的结果,函数一直返回 8 ,但这就是问题 - consistency
。
我可以使用哪种类型的范例或实用解决方案在特定范围内生成更多随机数?
我已将此标记为Lua,但任何可理解的语言的解决方案均可接受。
答案 0 :(得分:2)
我不想要这么严格的一致性。
这是什么意思?
如果您在任何RNG的给定范围内平均非常大量的值,您应该期望生成相同的数字。这意味着该范围内的每个数字都可能出现。
这个功能不起作用,因为我想要它。我主要得到的数字是6.8和7.2,但是甚至没有接近8。
你必须澄清“不起作用”的含义。你为什么期望它给你8?您可以看到它不仅仅是通过查看您使用的公式。
例如,如果您使用math.random(1,10)
,假设范围内的所有数字都有相同的出现机会,您应该预期平均值为5.5,在1和10的中间死亡(因为( 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10)/ 10 = 5.5)。
你使用了math.random() > .3 and math.random(7,10) or math.random(1,6)
,它说70%的时间给7,8,9或10(平均值= 8.5),30%的时间给你1,2,3,4, 5或6(平均值= 3.5)。这应该给你一个总体平均值7(因为3.5 * .3 + 8.5 * .7 = 7)。如果你提高样本量,那就是你会看到的。你看到任何一种尺寸的值,因为你的样本量很小(尝试将其提高到100000)。
答案 1 :(得分:1)
我之前通过简单地在该范围内生成两个随机数,然后选择最大(或最小)的随机数。这会使向高(或低)端点的概率发生偏差。
挑选最小的两个为您提供线性概率分布。 挑选最小的三个为您提供抛物线分布(选择性更高,“另一端”的概率更小)。根据我的需要,线性分布很好。
不完全是你想要的,但也许它已经足够了。
玩得开心!