如何获得更高频率的某个"random range"?
How can I acquire a certain "random range" in a higher frequency?
我的问题基本上是,“我怎样才能获得特定范围内的某些随机值而不是范围外的随机值?”
请允许我证明我的意思:
If I were to, on a good amount of trials, start picking a variety of
random numbers from 1-10, I should be seeing more numbers in the 7-10
range than in the 1-6 range.
我尝试了几种方法,但没有得到理想的结果。
第一个函数:
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,但任何可以理解的语言的解决方案都是可以接受的。
I don't want such strict consistancy.
这是什么意思?
如果您对任何 RNG 的给定范围内的大量值进行平均,您应该期望产生相同的数字。这意味着该范围内的每个数字出现的可能性相同。
This function didn't work as I wanted it to either. I primarily getting numbers such as 6.8 and 7.2 but nothing even close to 8.
你必须弄清楚"didn't work"是什么意思。你为什么期望它给你 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)。
我之前通过简单地生成范围内的两个随机数,然后选择最大(或最小)的随机值来制作偏斜的随机值。这会使概率偏向高(或低)端点。
从两个中选择最小的一个可以得到线性概率分布。
选择三个中最小的一个会给你一个抛物线分布(更多的选择性,在 "the other end" 的概率更小)。对于我的需要,线性分布很好。
不完全是您想要的,但也许已经足够好了。
玩得开心!
我的问题基本上是,“我怎样才能获得特定范围内的某些随机值而不是范围外的随机值?”
请允许我证明我的意思:
If I were to, on a good amount of trials, start picking a variety of random numbers from 1-10, I should be seeing more numbers in the 7-10 range than in the 1-6 range.
我尝试了几种方法,但没有得到理想的结果。
第一个函数:
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,但任何可以理解的语言的解决方案都是可以接受的。
I don't want such strict consistancy.
这是什么意思?
如果您对任何 RNG 的给定范围内的大量值进行平均,您应该期望产生相同的数字。这意味着该范围内的每个数字出现的可能性相同。
This function didn't work as I wanted it to either. I primarily getting numbers such as 6.8 and 7.2 but nothing even close to 8.
你必须弄清楚"didn't work"是什么意思。你为什么期望它给你 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)。
我之前通过简单地生成范围内的两个随机数,然后选择最大(或最小)的随机值来制作偏斜的随机值。这会使概率偏向高(或低)端点。
从两个中选择最小的一个可以得到线性概率分布。 选择三个中最小的一个会给你一个抛物线分布(更多的选择性,在 "the other end" 的概率更小)。对于我的需要,线性分布很好。
不完全是您想要的,但也许已经足够好了。
玩得开心!