Разные цвета Python

У меня проблема. Мне нужно создать список colors, в котором каждые три значения являются цветом rgb.

То есть первые три элемента списка это например: 234 56 145. Где 234: кол-во красного, 56 зеленого, 145 синего.

Все числа должны быть случайными от 0 до 255.
Нужно сделать так, что-бы все цвета не повторялись. То есть чтобы не было двух одинаковых значений rgb.
Желательно приведите пример с кодом.


Ответы (4 шт):

Автор решения: S. Nick

Попробуйте так:

import random

random.sample(range(255), 3)
→ Ссылка
Автор решения: passant

То-ли вы не точно сформулировали вопрос, то-ли ответ на него тривиален. Если вот это требование точно,

Нужно сделать так, что-бы все цвета не повторялись. То есть чтобы не было двух одинаковых значений 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)

Заранее извиняюсь за неграмотность кода, так как опыта мало.

→ Ссылка
Автор решения: CrazyElf

Предложу и я свой смешной способ. Сначала код:

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%.

Но надо помнить, что это рандом и цифры с каждым запуском могут быть другие.

→ Ссылка