Sembra una domanda facile, ma trovo sorprendentemente difficile riuscire a ottenere buoni risultati.Come disegnare in modo preciso esattamente N punti sullo schermo?
Il primo algoritmo che ho creato è quello di disegnare punti casualmente, controllare da un set se è già stato disegnato e disegnarlo diversamente. Funziona bene se stiamo disegnando pochi punti ma rallenta catastroficamente mentre ci avviciniamo allo schermo.
Il meglio che ho trovato è quello di costruire l'elenco dei pixel, mischiarlo e scegliere il primo n (ho usato python's random.sample per quello). Funziona meglio, ma è ancora un po 'lento perché l'intera lista di pixel deve essere costruita in memoria, che è orribilmente esagerata quando si disegnano 5 punti. Ecco il mio codice 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()
Qualche suggerimento per un algoritmo migliore?
Modifica: Appena scoperto questo problema è chiamato "campionamento del serbatoio". Wikipedia ha una serie di buoni algoritmi: https://en.wikipedia.org/wiki/Reservoir_sampling
A prima vista '(x, y) per (x, y) in 'non sembra necessario –
@ cricket_007: buon punto, questo era un avanzo da una versione iniziale . Ho modificato il codice nella mia domanda. –