2017-02-07 7 views
2

У меня есть 2D-список, мне нужно выбрать n различных случайных точек (x, y координат) из этого 2D-списка. Позвольте мне сначала написать то, что произошло со мной, когда я попытался решить проблему.Как выбрать отдельные случайные точки в сетке

Скажем, сетка 300 x 400.

  • ли декартово произведение 300 x 400 получить список 120000 элементов, чем использовать random.choice(Slow для больших сетей)
  • Держите выбранные точки в наборе, рандомизации снова в цикле в то время как, если дубликат точка производится. (очень медленно и непредсказуемо, если п велико)

Я искал некоторые подобные вопросы SO, ни один из них не решить проблему непосредственно. Я нашел This question, хотя пользователи отвечают на проблему, они не предлагают решение Python, которое мы можем здесь сделать в этом вопросе. Возможно, использование соответствующих структур данных в стандартной библиотеке Python может быть предложено, если не сам код.

ответ

2

Используйте random.sample для образца без замены из диапазона - есть быстрый специальный чехол для объектов диапазона. divmod(i, h) - лексикографическое отображение от i в 1D диапазоне с w * h элементами до (x, y) в 2D сетке.

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

 Смежные вопросы

  • Нет связанных вопросов^_^