2017-02-07 9 views
2

私は2Dリストを持っていますので、この2Dリストから別のランダム点(x、y座標)を選択する必要があります。n私が問題を解決しようとしたときに、まず私に何が起こったかを書いてみましょう。グリッド内の別のランダムな点を選択する方法

グリッドが300 x 400であるとします。

  • random.choice(大規模グリッドのスロー)を使用するよりも、
  • がセットで選択した点に注意してください、120000要素のリストを取得直積300 x 400を行い、重複するポイントがある場合、whileループで再びランダム化生産された。 (非常に遅いと予測不可能なnが大きい場合)

私はそれらのどれもが直接問題を解決しない、SOでいくつかの同様の質問を検索します。私はThis questionを見つけましたが、ユーザーは問題に答えましたが、Pythonソリューションは提供していません。たぶんコード自体ではなく、Pythonの標準ライブラリで適切なデータ構造を使用することをお勧めします。

答えて

2

random.sampleを使用すると、範囲からの置換を行わずにサンプリングできます。範囲オブジェクトには高速な特殊ケースがあります。 divmod(i, h)は、1D範囲のiから、w * hの要素を含む、2Dグリッド内の(x, y)の辞書式マッピングです。

のPython 3:

import random 
def samplegrid(w, h, n): 
    return [divmod(i, h) for i in random.sample(range(w * h), n)] 

のPython 2:

これは働いているように見える
import random 
def samplegrid(w, h, n): 
    return [divmod(i, h) for i in random.sample(xrange(w * h), n)] 
+0

、あなたはどのようにこの作品とどのようにそれは重複を避け説明してくださいだろうか? – Rockybilly

+0

@Rockybilly 'random.sample'サンプルは置き換えられません。私はドキュメントをリンクしました。 –

+0

私は前に 'random.sample'を使っていましたが、乱数を' h 'に分けて分かち書きをするだけで分かりました。 – Rockybilly

関連する問題