Ни один из ответов, представленных на этой странице, не работает, если вам нужно, чтобы выходные данные были равномерно распределены.
Чтобы проиллюстрировать мои примеры, предположим, что мы объединяем два списка A=[1,2,3]
, B=[a,b,c]
В подходе, упомянутом в большинстве ответов (т. Е. Объединение двух списков по принципу слияния, но каждый раз случайный выбор заголовка списка), вывод [1 a 2 b 3 c]
гораздо менее вероятен, чем [1 2 3 a b c]
. Интуитивно понятно, что это происходит потому, что когда у вас заканчиваются элементы в списке, элементы в другом списке добавляются в конце. Из-за этого вероятность для первого случая составляет 0.5*0.5*0.5 = 0.5^3 = 0.125
, но во втором случае больше случайных случайных событий, так как случайная голова должна выбираться 5 раз вместо 3, что оставляет нам вероятность 0.5^5 = 0.03125
. Эмпирическая оценка также легко подтверждает эти результаты.
Ответ, предложенный @marcog, почти правильный. Однако существует проблема, когда распределение r
не является равномерным после сортировки. Это происходит потому, что исходные списки [0,1,2]
, [2,1,0]
, [2,1,0]
все сортируются в [0,1,2], что делает сортировку r
более вероятной, чем, например, [0,0,0]
, для которой существует только один возможность.
Существует умный способ создания списка r
таким образом, чтобы он был равномерно распределен, как видно из этого вопроса Math StackExchange: https://math.stackexchange.com/questions/3218854/randomly-generate-a-sorted-set-with-uniform-distribution
Чтобы подвести итог ответа на этот вопрос, вы должны попробовать | B | элементы (равномерно наугад и без повторений) из набора {0,1,..|A|+|B|-1}
, сортируют результат и затем вычитают его индекс для каждого элемента в этом новом списке. В результате получается список r
, который можно использовать вместо ответа @ marcog.