2016-05-15 4 views
1

x, range, dを整数にする。私たちは、私が思いついた別の番号から十分に離れた乱数を生成する

  • 1 <= y <= range
  • abs(x-y) >= d

ひとつのアイデアは、いくつかの小さな範囲を生成し、いくつかの調整が数字を処理できるようにすることであるように、数yを生成したいのですがあまりにも近くに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)は離れ少なくとも単位である10の範囲1の数値を返す必要がありますこれは、3,4,5,6,7を戻り値として除外し、10-5 = 5の有効な数値を残します。この関数は、1から5の範囲の1つを選択します。選択された数が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、range = 1000'の場合、ループは何百回も進むと予想されます。それでも私は知っている+1 –

+0

彼のポストは私には少し不明だった。私は彼がちょっとした修正をしたいと思った。考慮すべきことがいくつかあります。 )それでは、今作業しています;) – Joseph

+0

そして、十分な運があれば、ループは永遠に続くかもしれません。エラーチェックはかなり難しいです。 – marmistrz

関連する問題