2016-05-03 4 views
0

私はnumpyを使ってPythonでループを作成しようとしています。これは0から20の間で無作為に生成された5つの数値を持つ変数 "times"を与えます。そのリスト内の2つの隣接要素間の違いは1つもありません。これを達成する最良の方法は何ですか?私は最後の2行のコードを試しましたが、これは間違っている可能性が最も高いです。Pythonで乱数生成を制限する

4.25230915 4.36463992 10.35915732 12.39446368 18.46893283

しかし、このようなものは完璧になる:

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.47166904 6.85610453 10.81431629 12.10176092 15.53569052

答えて

3

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 

それはとてもパラメータに依存し解決策を見つけるために時間が大きくなる可能性があり、前の回答と同じ試行錯誤のアプローチを使用しています。

+0

他の回答の数字の翻訳は明確です –

+0

ありがとう、ハンネス、それは完全に動作し、数字は素晴らしいです!引数を渡した後、xを関数の中でグローバルに、そしてxを外側に印刷しました。 – Spica

+0

いいえ、本当に必要な場合以外は、しないでください。あなたはおそらくそうでないでしょう:)代わりに 'times = uniform_min_range(0、20、5、1.0)'と 'print times'と呼んでください。 –

1

均一な配信を保証するヒットミスアプローチを使用してください。ここでnumpyのために微調整できるべきであるストレートPython実装です:実現可能な解決策がない場合

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 

例えば、

>>> randSpacedPoints(5,0,20,1) 
[0.6681336968970486, 6.882374558960349, 9.73325447748434, 11.774594560239493, 16.009157676493903] 

これは無限ループにハングします(あなたがしたい場合があります試行回数を制御する安全性パラメータを追加する)。

+0

http://imgur.com/j4iPNphの制限に問題があるようです。おそらく(-1、0)と(20,21)にミスが発生しない可能性があります。実際には重要ではないかもしれないが、私はメモとして追加したかった。 – ayhan

+0

ジョンありがとう!残念ながら、私はPythonを初めて使用しているので、私はまだあなたのソリューションの周りを頭で覆そうとしています。コードをエディタに貼り付けてコピーします。私は、インポートとdefの間に変数n、a、b、minDistを定義する必要があると考えました。しかし、私は数字ではありません。私はちょうど "**負荷時間:0.00秒"を得ます – Spica

+1

@ayhan数字自体は一様ではありません。この制約により、数値は強制的に終点に向かって偏っていきます。言及した一様性は、ベクトルがすべてのそのようなベクトルの中から一様に選択されることである。 –