2016-12-09 5 views
1

浮動小数点数を使ってオブジェクトの位置を定義する、仮想現実世界にオブジェクトを配置するためのランダムな浮動小数点数を生成したいと考えています。今は、random.uniform呼び出しを使用してオブジェクトで「ボックス」を一様に塗りつぶすのは簡単です。私がやりたい何不連続な範囲のセットでランダムな浮動小数点数を生成する

import random 

#generate random floating coordinates 
for z in range(1000): 
    x = random.uniform(-1,1) 
    y = random.uniform(-1,1) 
    z = random.uniform(-1,1) 
    #shape = vizshape.addSphere() commented out because this is an uncommon module for VR but I wanted to show how floats are being used 
    #shape.setPosition([x,y,z]) 

は、引数を渡すが、それがで山車を生成するための1つの以上の範囲を指定します)(random.uniformすることで、何かのように:もちろんこれは、エラーの原因となります

x = random.uniform([-1,1],[2,3]) 

私は浮動小数点数をサイズの異なる複数の不連続な範囲で取得する方法を探しています。私は、生成された浮動小数点が私の希望する範囲内にあるかどうかを確認するために別のチェックを書かずに、それをやりたいと思います。何か案は?

答えて

1

アイデアが最初に選択された範囲内のランダムなフロートで範囲を覗くことであろう。しかしながら、この問題は、すべての範囲にわたって均一であることが必要であり、その長さは考慮されるべきである。さもなければ、より短い範囲は、長期的には、より長いものと同じ数のサンプルを得るが、これは一様な挙動ではない。

この問題に対処するために、たとえば、[0,1]の間隔にすべての範囲をマッピングして、相対的な長さを保存することができます。 、[an, bn]

  • di = bi - aii番目の範囲の長さ
  • Lはすべてdiの合計としようとする

    1. ソート昇順に範囲と[a1, b1]を取得し、...:ここではどのようにあります
    2. 地図a1~0およびb1~d1/L
    3. についてはi >= 2aiのマッピングにb_{i-1}biの値にdi/Lをマッピングします。
    4. すべてについてi >= 1xiaiのマッピングとします。

    今均一[0,1]でサンプリングされた乱数sを取ると、

    1. i0iようにxi <= sことを最後のインデックスとする次のように進みます。
    2. 答えを得るにはi0番目のマッピングの逆を使用してください。換言すれば、

      F =のA_ {I 0} +(S-XI)* L /ジ

      と答えるこの数字fi0番目の区間であり、ランダムに一様に選択されています。

    enter image description here

  • 1

    これは、ハッキングのビットですが、それは簡単に複数の不連続範囲に一般化することができる。

    import random 
    
    def getRandoms(n, ranges): 
        answer = [] 
        for _ in xrange(n): 
         low,high = random.choice(ranges) 
         answer.append(random.uniform(low, high)) 
    
        return answer 
    
    関連する問題