Python 从范围生成均匀分布的数字列表

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帧等情况下渲染图像序列。相反,我想渲染第一帧、最后一帧、中间帧、中间帧的中间帧

我以前见过有人问过这个问题,但我正在寻找一个扭曲的答案:

假设我有一个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帧等情况下渲染图像序列。相反,我想渲染第一帧、最后一帧、中间帧、中间帧的中间帧,直到所有帧都被计算出来。

好的,所以你想要的帧有点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、100、5)
      ,第一次循环迭代将尝试0、50和100,并且只添加50,因为这并不存在;第二次迭代将尝试0、25、50、75和100,并且只添加25和75)
    • 如果我们在
      nums
      中有足够的数字,我们就完成了
  • 返回
    nums

您的列表与您要求的步长跳转不匹配,这使您的问题非常混乱。我认为OP的期望输出,例如
数字(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]