Разные цвета Python
У меня проблема. Мне нужно создать список colors, в котором каждые три значения являются цветом rgb.
То есть первые три элемента списка это например: 234 56 145. Где 234: кол-во красного, 56 зеленого, 145 синего.
Все числа должны быть случайными от 0 до 255.
Нужно сделать так, что-бы все цвета не повторялись.
То есть чтобы не было двух одинаковых значений rgb.
Желательно приведите пример с кодом.
Ответы (4 шт):
То-ли вы не точно сформулировали вопрос, то-ли ответ на него тривиален. Если вот это требование точно,
Нужно сделать так, что-бы все цвета не повторялись. То есть чтобы не было двух одинаковых значений rgb.
то единственный ваш путь, что-бы добиться неповторения цвета - сгенерировать все возможные комбинации цветов а потом извлекать из этого множества столько образцов, сколько надо.
Сделать это можно, например, вот так:
import random
zzz=[]
for i in range(256):
for j in range(256):
for k in range(256):
zzz.append([i,j,k])
random.sample(zzz,5)
или вот так:
import itertools
zzz=list(itertools.product([i for i in range(256)],[j for j in range(256)],[k for k in range(256)], repeat=1))
random.sample(zzz,5)
Если же просто сделать random.sample(range(Х), 3) то получим повторы. Вот пример - 15 случайных образцов из 27 возможных комбинаций
import random
for i in range (15):
print(random.sample(range(3), 3))
Результат:
[1, 0, 2]
[2, 0, 1]
[0, 2, 1]
[1, 2, 0]
[1, 0, 2]
[0, 2, 1]
[1, 2, 0]
[2, 0, 1]
[0, 2, 1]
[1, 0, 2]
[2, 1, 0]
[2, 0, 1]
[2, 1, 0]
[0, 1, 2]
[1, 2, 0]
Повторов более чем достаточно.
Если без повторений, то можно попробовать так:
import random
for i in range(1):
spisok = []
a = random.randint(0, 256)
b = random.randint(0, 256)
c = random.randint(0, 256)
if a != b and a != c and b != c:
spisok.append(a)
spisok.append(b)
spisok.append(c)
print(spisok)
Заранее извиняюсь за неграмотность кода, так как опыта мало.
Предложу и я свой смешной способ. Сначала код:
from random import shuffle
def get256random():
l = list(range(256))
shuffle(l)
return l
def get256rgb():
r256 = get256random()
g256 = get256random()
b256 = get256random()
rgb = [(r,g,b) for (r,g,b) in zip(r256,g256,b256)]
return rgb
s = set()
l = []
for i in range(10000):
rgb = get256rgb();
rgb_uniq = [(r,g,b) for (r,g,b) in rgb if not (r,g,b) in s]
l.append(len(rgb_uniq))
s.update(rgb_uniq)
print(l[:10])
print(l.index(255))
print(l[-10:])
print(len(s), len(s)/(10000*256))
Моя функция get255rgb гарантированно выдаёт 256 разных цветовых сочетаний. Её можно использовать повторно, получая так же пачку 256 новых не повторяющихся цветов, но все следующие пачки уже надо проверять - не встречались ли такие цвета в предыдущих пачках. В переменную rgb_uniq выбирается очередная пачка цветов, которые ещё не встречались. В конце проверка - а на какой итерации начинаются повторы? А сколько повторов бывает после 10000 циклов?
[256, 256, 256, 256, 256, 256, 256, 256, 256, 256]
15
[216, 213, 219, 219, 225, 227, 211, 234, 232, 224]
2374357 0.927483203125
Итак, в начале повторов не было - выдавалось по 256 уникальных цветов.
Первый повтор встретился на 16-й итерации.
После 10000 циклов встречалось уже в среднем по 20% повторов.
Всего было сгенерировано 2374357 уникальных цветов, повторов суммарно было меньше 8%.
Но надо помнить, что это рандом и цифры с каждым запуском могут быть другие.