Python中的随机数生成约束

Python中的随机数生成约束,python,numpy,random,Python,Numpy,Random,我正在尝试使用numpy在Python中创建一个循环,该循环将给我一个变量“times”,其中5个数字是在0到20之间随机生成的。但是,我希望有一个条件:该列表中两个相邻元素之间的差异都不小于1。实现这一目标的最佳方式是什么?我尝试了最后两行代码,但这很可能是错误的 for j in range(1,6): times = np.random.rand(1, 5) * 20 times.sort() print times da = np.diff(times

我正在尝试使用numpy在Python中创建一个循环,该循环将给我一个变量“times”,其中5个数字是在0到20之间随机生成的。但是,我希望有一个条件:该列表中两个相邻元素之间的差异都不小于1。实现这一目标的最佳方式是什么?我尝试了最后两行代码,但这很可能是错误的

for j in range(1,6):

    times = np.random.rand(1, 5) * 20
    times.sort()
    print times

    da = np.diff(times) 

    if da.sum < 1: break
范围(1,6)内j的
:
时间=np.随机.兰德(1,5)*20
times.sort()
印刷时间
da=np.diff(次)
如果da.sum<1:中断
例如,对于一次迭代,这将是不好的:

4.25230915 4.36463992 10.35915732 12.39446368 18.46893283

但像这样的东西是完美的:


1.47166904 6.85610453 10.81431629 12.10176092 15.53569052

使用命中和未命中方法确保均匀分布。下面是一个直接的Python实现,应该可以针对numpy进行调整:

import random

def randSpacedPoints(n,a,b,minDist):
    #draws n random numbers in [a,b]
    # with property that their distance apart is >= minDist
    #uses a hit-miss approach

    while True:
        nums = [a + (b-a)*random.random() for i in range(n)]
        nums.sort()
        if all(nums[i] + minDist < nums[i+1] for i in range(n-1)):
            return nums

如果没有可行的解决方案,这将挂在一个无限循环中(因此您可能希望添加一个控制试验数量的安全参数)。

使用命中和未命中的方法来确保均匀分布。下面是一个直接的Python实现,应该可以针对numpy进行调整:

import random

def randSpacedPoints(n,a,b,minDist):
    #draws n random numbers in [a,b]
    # with property that their distance apart is >= minDist
    #uses a hit-miss approach

    while True:
        nums = [a + (b-a)*random.random() for i in range(n)]
        nums.sort()
        if all(nums[i] + minDist < nums[i+1] for i in range(n-1)):
            return nums

如果没有可行的解决方案,这将挂起在一个无限循环中(因此您可能希望添加一个控制试验次数的安全参数)。

由于您使用的是numpy,您也可以使用内置函数来处理均匀随机数

def uniform_min_range(a, b, n, min_dist):
    while True:
        x = np.random.uniform(a, b, size=n)
        np.sort(x)
        if np.all(np.diff(x) >= min_dist):
            return x

它使用与前面答案相同的试错方法,因此根据参数,找到解决方案的时间可能会很长

既然您使用的是numpy,那么您最好使用统一随机数的内置函数

def uniform_min_range(a, b, n, min_dist):
    while True:
        x = np.random.uniform(a, b, size=n)
        np.sort(x)
        if np.all(np.diff(x) >= min_dist):
            return x


它使用与前面答案相同的试错方法,因此根据参数,找到解决方案的时间可能会很长

限制似乎有问题,这可能是因为(-1,0)和(20,21)不会发生未命中。实际上可能并不重要,但我想补充一句,谢谢你,约翰!不幸的是,因为我是Python新手,所以我仍然在试图理解您的解决方案。我正在将您的代码复制粘贴到我的编辑器中。我想我应该在import和def之间定义变量n,a,b,minDist。但我不知道这些数字。我只得到一个“**加载时间:0.00秒”@ayhan这些数字本身并不一致。约束迫使数字偏向端点。我提到的一致性是,向量是从所有这些向量中统一选择的。@johncolman你是对的,我混淆了两个不同的概念。@Spica。很高兴您能使用它,不过从编程的角度来看,在这样的函数中添加print语句会降低它作为函数的可用性。更好的设计是让调用代码打印结果。限制似乎有问题,可能是因为(-1,0)和(20,21)不会发生未命中。实际上可能并不重要,但我想补充一句,谢谢你,约翰!不幸的是,因为我是Python新手,所以我仍然在试图理解您的解决方案。我正在将您的代码复制粘贴到我的编辑器中。我想我应该在import和def之间定义变量n,a,b,minDist。但我不知道这些数字。我只得到一个“**加载时间:0.00秒”@ayhan这些数字本身并不一致。约束迫使数字偏向端点。我提到的一致性是,向量是从所有这些向量中统一选择的。@johncolman你是对的,我混淆了两个不同的概念。@Spica。很高兴您能使用它,不过从编程的角度来看,在这样的函数中添加print语句会降低它作为函数的可用性。让调用代码打印结果是更好的设计。另一个答案的简单翻译是一个明确的加号谢谢你,汉内斯,它工作完美,数字看起来很棒!在传递参数之后,我在函数内部生成了一个全局x,在函数外部生成了打印的x。不,除非你真的需要,否则请不要这样做。你很可能不会:)取而代之的是称之为
times=uniform\u min\u range(0,20,5,1.0)
,然后称之为
print times
。完成!非常感谢汉斯!另一个答案的简单翻译是一个明确的加号谢谢你,汉内斯,它工作完美,数字看起来很棒!在传递参数之后,我在函数内部生成了一个全局x,在函数外部生成了打印的x。不,除非你真的需要,否则请不要这样做。你很可能不会:)取而代之的是称之为
times=uniform\u min\u range(0,20,5,1.0)
,然后称之为
print times
。完成!非常感谢汉斯!