这似乎是一个简单的问题,但我发现它很难做到性能好。
我想到的第一个算法是随机绘制点,从集合中检查它是否已经被绘制过,否则就绘制它。如果我们只绘制少量的点,这个算法效果很好,但当我们接近填充屏幕时,速度会急剧减慢。
我想到的最好的算法是构建像素列表,随机打乱并选择前n个(我使用了Python的random.sample)。这个方法效果更好,但仍然有点慢,因为需要在内存中构建整个像素列表,当只绘制5个点时这样做非常浪费资源。以下是我的Python代码:
任何更好算法的建议?
编辑:刚发现这个问题被称为“蓄水池抽样”,维基百科有很多好的算法:https://en.wikipedia.org/wiki/Reservoir_sampling
我想到的第一个算法是随机绘制点,从集合中检查它是否已经被绘制过,否则就绘制它。如果我们只绘制少量的点,这个算法效果很好,但当我们接近填充屏幕时,速度会急剧减慢。
我想到的最好的算法是构建像素列表,随机打乱并选择前n个(我使用了Python的random.sample)。这个方法效果更好,但仍然有点慢,因为需要在内存中构建整个像素列表,当只绘制5个点时这样做非常浪费资源。以下是我的Python代码:
#!/usr/bin/env python
""" drawn n random points on the screen """
import pygame
from pygame.locals import *
import sys
import random
from itertools import product
n = int(sys.argv[1])
s = pygame.display.set_mode()
sx, sy = s.get_size()
points = random.sample(list(product(range(sx), range(sy))), n)
for p in points:
s.fill((255, 255, 255), pygame.Rect(*p, 1, 1))
pygame.display.flip()
while True:
for event in pygame.event.get():
if event.type == QUIT or event.type == KEYDOWN:
sys.exit()
任何更好算法的建议?
编辑:刚发现这个问题被称为“蓄水池抽样”,维基百科有很多好的算法:https://en.wikipedia.org/wiki/Reservoir_sampling
(x, y) for (x, y) in
似乎不是必须的。 - OneCricketeer