【发布时间】:2016-04-06 15:05:59
【问题描述】:
假设我有一个有效X = [1, 2, 3, 4, 5] 的列表和一个有效Y = [1, 2, 3, 4, 5] 的列表。
我需要生成X 中每个元素和Y 中每个元素(在本例中为25)的所有组合,并以随机顺序获取这些组合。
这本身很简单,但还有一个额外的要求:在这个随机顺序中,不能连续重复相同的x。例如,这没关系:
[1, 3]
[2, 5]
[1, 2]
...
[1, 4]
这不是:
[1, 3]
[1, 2] <== the "1" cannot repeat, because there was already one before
[2, 5]
...
[1, 4]
现在,效率最低的想法是简单地随机化整个集合,只要没有更多的重复。我的方法有点不同,反复创建X 的一个随机变体,以及所有Y * X 的列表,然后从中随机选择一个。到目前为止,我想出了这个:
import random
output = []
num_x = 5
num_y = 5
all_ys = list(xrange(1, num_y + 1)) * num_x
while True:
# end if no more are available
if len(output) == num_x * num_y:
break
xs = list(xrange(1, num_x + 1))
while len(xs):
next_x = random.choice(xs)
next_y = random.choice(all_ys)
if [next_x, next_y] not in output:
xs.remove(next_x)
all_ys.remove(next_y)
output.append([next_x, next_y])
print(sorted(output))
但我确信这可以更有效或更简洁地完成?
另外,我的解决方案首先遍历所有X 值,然后再次继续完整集,这不是完全随机的。对于我的特定应用案例,我可以忍受。
【问题讨论】:
-
为什么是
list(xrange ...而不是range,还有为什么不是while len(output)<num_xy? -
我现在明白了——您最初的问题对此并不十分清楚,尽管编辑说明了这一点。您是否希望所有此类排序以相同的概率出现?
-
len(X) 和 len(Y) 通常有多大?如果规模小,不要立即放弃简单、明显、可读和低效的解决方案。
-
@JohnColeman Aww,没有 BOGO 排序?这是我的答案。
-
只是想感谢您提出这个问题。对于过渡到编程的工程师,到目前为止,我已经花了 2 个小时进行了 6 次尝试,试图通过
if检查来绕过蛮力方面,几乎可以肯定是以一种被误导的方式,但我已经了解了更多关于编程的知识这个问题比其他任何问题都好:)
标签: python