2016-05-15 128 views
1

x, range, d为整数。我们希望产生一批y,这样生成一个足够远离另一个数的随机数

  • 我想出了是1 <= y <= range
  • abs(x-y) >= d

一个想法产生了一些较小的范围内,然后做一些调整来处理数字这太接近x。但那真是太乏味了。

有没有更好的方法来做到这一点?

+0

会带你想要的距离'D',然后添加随机数它是一种选择?这样'd + y'将是随机的,并且总是在想要的距离。 –

回答

2

这里是一个Python函数,你应该能够适应您所选择的语言:

import random 

def distantRand(a,b,x,d): 
    #returns a random integer in range a ... b 
    #which is greater than or equal to d units from x 

    lb = max(a,x-d+1) 
    ub = min(b,x+d-1) 
    k = ub-lb+1 #number of numbers ruled out 

    if b-k < a: 
     return None 
    else: 
     y = random.randint(a,b-k) 
     if y > x - d: 
      y = y + k 
     return y 

例如,distantRand(1,10,5,3)应该取值范围为1回至10的数至少是单位处从5.这排除了3,4,5,6,7作为返回值,留下10-5 = 5有效数字。该函数在1到5的范围内选择一个。如果选择的数字> 2,则添加5以使其数值大于7(但仍为< = 10)。例如:

>>> for i in range(20): 
    print(distantRand(1,10,5,3)) 

1 
1 
1 
8 
2 
9 
10 
8 
1 
10 
10 
2 
8 
10 
8 
8 
8 
2 
1 
2 
+0

'x-d'可能是负数,例如'distantRand(1,10,2,4)' – marmistrz

+0

@marmistrz好点。我更关心我如何计算'k'。 –

1

我已经在Python中这样做了。

import random 

range=100 
d=20 
x=115 

while(True): 
    y=random.randint(1,range) 
    if abs(x-y)>=d:  
     print abs(x-y) 
     print y 
     break 

这里,它是作为高清

import random 

r=100 
d=20 
x=115 

def yourandom (x,d,r): 
    while(True): 
     y=random.randint(1,r) 
     if abs(x-y)>=d: 
      print "abs(x-y)=",abs(x-y) 
      print "y=",y 
      break 


yourandom(x,d,r) 
+0

对于小'd',这是完全合理的,但对于更大的'd',它显然效率低下。如果'x = 500,d = 499,范围= 1000',则循环可能会有数百次。仍然 - 这是工作主意,所以+1 –

+0

我知道,但他的帖子有点不清楚。我以为他只是想快速修复。还有几件事情需要考虑。现在就开始工作;) – Joseph

+0

而且,如果我们运气不好,循环可能会永远运行。错误检查相当困难 – marmistrz