2016-05-15 56 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