Python 从范围生成均匀分布的数字列表
我以前见过有人问过这个问题,但我正在寻找一个扭曲的答案: 假设我有一个1-100的范围,我想生成一个特定步长的列表,比如:Python 从范围生成均匀分布的数字列表,python,distribution,Python,Distribution,我以前见过有人问过这个问题,但我正在寻找一个扭曲的答案: 假设我有一个1-100的范围,我想生成一个特定步长的列表,比如:numbers(1100,5)。这将返回[1,25,50,75100]。但是,我希望它返回[1100,50,25,75]或[1100,50,75,25]另一个例子是数字(1,10,10),它将给我类似于[1,10,5,2,7,3,8,4,9] 这可能吗?这样做的原因是能够在不从第1帧到第2帧再到第3帧等情况下渲染图像序列。相反,我想渲染第一帧、最后一帧、中间帧、中间帧的中间帧
numbers(1100,5)
。这将返回[1,25,50,75100]
。但是,我希望它返回[1100,50,25,75]
或[1100,50,75,25]
另一个例子是数字(1,10,10),它将给我类似于[1,10,5,2,7,3,8,4,9]
这可能吗?这样做的原因是能够在不从第1帧到第2帧再到第3帧等情况下渲染图像序列。相反,我想渲染第一帧、最后一帧、中间帧、中间帧的中间帧,直到所有帧都被计算出来。好的,所以你想要的帧有点wierd,特别是第一个示例中的元素分布不均匀,例如100-75=25、75-50=25、50-25=25、25-1=24 但是,如果我们假设您始终希望帧中的“开始”和“结束”值,并且希望均匀间隔的值与最大值相对应,我们可以这样做:
def numbers(start,stop,step=1):
frame = [start]+range(y,stop,(start-stop)/(step-1))
return frame
该模块包括一个方法,该方法获取数组并将其洗牌到位
这意味着功能变为:
from random import shuffle
def numbers(start,stop,step=1):
frame = [start]+range(y,stop,(start-stop)/(step-1))
shuffle(frame)
return frame
为我们提供以下测试运行:
>>> numbers(1,100,5)
[100, 50, 75, 1, 25]
>>> numbers(1,10,10)
[1, 3, 10, 9, 6, 5, 8, 4, 7, 2]
原始(但错误)答案 该模块包括一个方法,该方法获取数组并将其洗牌到位 例如:
from random import shuffle
def numbers(start,stop,step=1):
frame = range(start,stop,step)
shuffle(frame)
return frame
然后调用此函数,我们得到:
>>> numbers(1,100,25)
[1, 51, 26, 76]
>>> numbers(1,100,25)
[76, 26, 1, 51]
注意,根据该函数,
步骤
值被重复添加到开始
,使得最终数组的形式为[开始,开始+1*步骤,开始+2*步骤…开始+n*步骤]
,其中开始+n*步骤
小于停止
,而开始+(n+1)*步骤
大于停止您的问题有点不明确,但这应该有助于您开始
def numbers(first, last, count):
nums = [first, last]
width = last - first
while len(nums) < count:
width /= 2
stepper = first
while stepper < last:
rounded = round(stepper)
if rounded not in nums:
nums.append(rounded)
if len(nums) == count:
break
stepper += width
return nums
基本算法如下:
- 从包含两个端点的
列表开始nums
- 将
初始化为两个端点之间的距离width
- 然后,循环:
- 减半
宽度
- 逐步通过
,first
,first+width
,…,first+2*width
,last width
,并将last
中尚未包含的内容添加到nums
(因此,对于nums
,第一次循环迭代将尝试0、50和100,并且只添加50,因为这并不存在;第二次迭代将尝试0、25、50、75和100,并且只添加25和75)数字(0、100、5)
- 如果我们在
中有足够的数字,我们就完成了nums
- 减半
- 返回
nums
数字(0,100,9)
(忽略一个错误)将是0,100,50,25,75,12.5,37.5,62.5,87.5,如果你看到了这个模式——前两个后面的值不是随机的,而是[01100]的中值→ 50,然后是[0,50]的中间值→ 25及[50100]→ 75,然后是[0,25]的中间值→ 12.5; 等等(我想除了四舍五入到整数之外)太棒了,谢谢。对不起,我说得含糊不清,把我的号码弄错了。Senshin比我自己更了解我想要的:)我似乎得到了一些关于som范围的奇怪结果,例如:数字(0,50,50)返回[0, 50, 25.0, 12.0, 24.0, 36.0, 48.0, 60.0, 6.0, 18.0, 30.0, 42.0, 54.0, 3.0, 9.0, 15.0, 21.0, 27.0, 33.0, 39.0, 45.0, 51.0, 1.0, 2.0, 4.0, 5.0, 7.0, 8.0, 10.0, 11.0, 13.0, 14.0, 16.0, 17.0, 19.0, 20.0, 22.0, 23.0, 26.0, 28.0, 29.0, 31.0, 32.0, 34.0, 35.0, 37.0, 38.0, 40.0, 41.0, 43.0]。除了60和54之外,它非常接近于正确。但是,它绝对接近于我可以使用的范围,因此我会将您的答案标记为已解决,再次感谢!@user2832718 Oops,我的错。stepper+=width
行应该在内部while
循环的末尾。现在应该表现得更正确。请注意我可能想在使用前执行某种错误检查(例如,如果你调用数字(0,10,20)
,你会遇到一个无限循环,因为0和10之间没有20个整数)。非常感谢@senshin!
>>> numbers(0, 100, 5)
[0, 100, 50, 25, 75]
>>> numbers(0, 10, 10)
[0, 10, 5, 2, 8, 1, 4, 6, 9, 3, 7]
>>> numbers(0, 50, 50)
[0, 50, 25, 12, 38, 6, 19, 31, 44, 3, 9, 16, 22, 28, 34, 41, 47, 2, 5, 8, 11, 14, 17, 20, 23, 27, 30, 33, 36, 39, 42, 45, 48, 1, 4, 7, 10, 13, 15, 18, 21, 24, 26, 29, 32, 35, 37, 40, 43, 46]