랜덤 컬러 생성기


440

이 기능이 주어지면 색상 을 임의의 색상 생성기 로 바꾸고 싶습니다 .

document.overlay = GPolyline.fromEncoded({
    color: "#0000FF",
    weight: 10,
    points: encoded_points,
    zoomFactor: 32,
    levels: encoded_levels,
    numLevels: 4
});

어떻게하니?


31
'#'+ Math.floor (Math.random () * 16777215) .toString (16);
SepehrM


2
@SepehrM 난수가 반환되면 0.001결과는 "#4189"(유효하지 않은 색상-4 자리)
Kamil Kiełczewski

이것은 나에게 매우 유용한 솔루션입니다. 매우 유용합니다. github.com/davidmerfield/randomColor
maikelm

5
'#'+Math.random().toString(16).substr(2,6) (출처 : CodeGolf )
ashleedawg

답변:


1018

사용 getRandomColor()의 장소 "#0000FF":

function getRandomColor() {
  var letters = '0123456789ABCDEF';
  var color = '#';
  for (var i = 0; i < 6; i++) {
    color += letters[Math.floor(Math.random() * 16)];
  }
  return color;
}



function setRandomColor() {
  $("#colorpad").css("background-color", getRandomColor());
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="colorpad" style="width:300px;height:300px;background-color:#000">

</div>
<button onclick="setRandomColor()">Random Color</button>


87
RGB가 색상 공간을 감싸는 방식 때문에 이것은 매우 어둡고 불포화 된 색상에 대한 편향이 있습니다. Martin Ankerl은 HSV와 같은 다른 공간에서 색상을 생성하는 것에 대한 훌륭한 기사를 가지고 있습니다 : martin.ankerl.com/2009/12/09/…
Thomas Ahle

13
사용할 때 0 또는 15를 칠 확률은 Math.round(Math.random()*15)1:30이지만 다른 숫자의 확률은 1:15입니다.
user123444555621 2016 년

3
.split ( '') 호출을 제거 할 수 있습니다. 문자열에는 이미 배열 인덱서가 있습니다.
ujeenator

3
당신은 또한 사용할 수 생성기 기능 으로 같은
tsuz

5
이 코드는 절름발이입니다. oneliner는 다음과 같습니다. Math.floor (Math.random () * 16777215) .toString (16)
DDD

269

나는 이것보다 빠르거나 짧은 것이 의심됩니다.

"#"+((1<<24)*Math.random()|0).toString(16)

도전!


18
0으로 채우는 것을 잊었습니다.
user123444555621

144
'#'+(Math.random()*0xFFFFFF<<0).toString(16);
Mohsen

15
@Mohsen, 참고로 모든 이제 다음 코드가 잘못 5 자리 숫자 생산
rochal

6
결과는 6 자리로 채워지지 않습니다
Taha Jahangir

33
('00000'+(Math.random()*(1<<24)|0).toString(16)).slice(-6)이 방법은 여전히 (거의) 같은 결과를 적은 수의 반환하지 않습니다하지만 항상 (6)의 길이를 반환 000cf4하거나 0000a7내가 생각 해키 조금입니다. 이 경우 빨간색 구성 요소는 임의의 색상에 영향을주지 않습니다.
bryc

162

이 문제에 대한 또 다른 견해는 다음과 같습니다.

저의 목표는 생생하고 뚜렷한 색상을 만드는 것이 었습니다. 색상을 구별하기 위해 임의의 생성기를 사용하지 않고 무지개에서 "균등 간격"색상을 선택하십시오.

이는 최적의 "고유성"(즉, 두 개의 마커가 유사한 색상을 가지지 않음)을 갖는 팝업 마커를 Google지도에 생성하는 데 적합합니다.

function rainbow(numOfSteps, step) {
    // This function generates vibrant, "evenly spaced" colours (i.e. no clustering). This is ideal for creating easily distinguishable vibrant markers in Google Maps and other apps.
    // Adam Cole, 2011-Sept-14
    // HSV to RBG adapted from: http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
    var r, g, b;
    var h = step / numOfSteps;
    var i = ~~(h * 6);
    var f = h * 6 - i;
    var q = 1 - f;
    switch(i % 6){
        case 0: r = 1; g = f; b = 0; break;
        case 1: r = q; g = 1; b = 0; break;
        case 2: r = 0; g = 1; b = f; break;
        case 3: r = 0; g = q; b = 1; break;
        case 4: r = f; g = 0; b = 1; break;
        case 5: r = 1; g = 0; b = q; break;
    }
    var c = "#" + ("00" + (~ ~(r * 255)).toString(16)).slice(-2) + ("00" + (~ ~(g * 255)).toString(16)).slice(-2) + ("00" + (~ ~(b * 255)).toString(16)).slice(-2);
    return (c);
}

이것이 실제로 어떻게 보이는지 보려면 http://blog.adamcole.ca/2011/11/simple-javascript-rainbow-color.html을 참조하십시오 .


7
나는 이런 것을 찾고 있었다! 좋은 물건!
Khôi

비슷한 질문에 대한 답변과 동일한 아이디어를 단순화 구현했습니다. stackoverflow.com/a/14187677/421010
Andrew

16
그렇다면 매개 변수의 값은 무엇입니까?
Ekramul Hoque

2
나는 또한 이와 같은 것을 만들었지 만, 그것은 매우 무작위적이고 분명합니다. 의사 코드는 여기에 있습니다 . hsv에는 훨씬 더 예측 가능한 동작이 있기 때문에 rgb 대신 hsv를 사용합니다. 파이썬 구현을보고 싶다면 여기여기에서 사용했습니다 . "컬러"에 대한 코드를 검색해야합니다.
zondo

1
@RobertMolina : 죄송합니다. 물건을 Gitlab으로 옮겼습니다. 의사 코드는 지금 여기 , 프로젝트와 여기여기 .
zondo

56

누가 이길 수 있습니까?

'#'+Math.random().toString(16).substr(-6);

항상 작동하도록 보장 : http://jsbin.com/OjELIfo/2/edit

@eterps 주석을 기반으로 임의의 색상의 16 진수 표현이 매우 짧은 경우 위의 코드는 여전히 더 짧은 문자열을 생성 할 수 있습니다 ( 0.730224609375=> 0.baf)

이 코드는 모든 경우에 작동해야합니다.

function makeRandomColor(){
  var c = '';
  while (c.length < 7) {
    c += (Math.random()).toString(16).substr(-6).substr(-1)
  }
  return '#'+c;
}

12
Math.random ()이 0.022092682472568126을 반환하면이 코드는 잘못된 '# 5a7dd'문자열을 생성합니다. 미친!
rochal

#ffffff 이후로 이와 같이 너무 자주 나타나지 않습니다.
Warface December

이것이 작동하지 않는 경우가 꽤 있습니다. Math.random () ... 0.730224609375, 0.43603515625, 0.957763671875에 대한 다음 출력을 확인하면 목록이 계속됩니다.
eterps

@eterps 이것들은 적절한 난수아닙니다 ! 16 진 원시 IEEE 754 이중 참조 :0.730224609375 = 0x3fe75e0000000000, 0.43603515625 = 0x3fdbe80000000000, 0.957763671875 = 0x3feea60000000000 . 가수가 거의 사용되지 않습니다! 그들은 단지 영광스러운 부분입니다. 적절한 : 숫자 '12 '출력이 같은 결과를 생성 할 것이다0.347876714234 = 0x3fd6439cb1ab32ac, 0.447556256665 = 0x3fdca4c2ff5fc450
bryc

2015 년 이래로 많은 웹 브라우저가 Math.random()@etertp의 결과를 담당하는 가정 에서 사용되는 엉터리 PRNG 를 더 나은 것으로 대체했다고 생각합니다. 따라서 품질이 낮은 난수 유형은 과거의 일이어야합니다 지금.
bryc

29

16 진 문자 해시가 필요하지 않습니다. 자바 스크립트는 그 자체로이를 수행 할 수 있습니다.

function get_random_color() {
  function c() {
    var hex = Math.floor(Math.random()*256).toString(16);
    return ("0"+String(hex)).substr(-2); // pad with zero
  }
  return "#"+c()+c()+c();
}

29

모든 브라우저에서 사용할 수있는 HSL을 사용할 수도 있습니다 ( http://caniuse.com/#feat=css3-colors )

function randomHsl() {
    return 'hsla(' + (Math.random() * 360) + ', 100%, 50%, 1)';
}

이것은 당신에게 밝은 색만을 줄 것이고, 당신은 밝기, 채도 및 알파로 놀 수 있습니다.

// es6
const randomHsl = () => `hsla(${Math.random() * 360}, 100%, 50%, 1)`

감사! 나는 다음을 사용하여 배경에 완벽한 색상을 얻었습니다.'hsla(' + (Math.floor(Math.random()*360) + ', 100%, 70%, 1)'
jj_

1
아니 prob, 난 아무도 hsl의 힘을 사용하여보고 놀랐습니다 :)
kigiri

stackoverflow.com/a/23861752/1693593 , hsla는 alpha = 1이 아닙니다. 그냥 hsl을 사용하십시오

1
16M kolor를 이런 식으로 생성 할 수는 없습니다 (예 : 흰색-회색 회색조를 얻지 못할 것입니다) – 예-각 구성 요소에 무작위를 사용하면 모든 hsl corol을 얻습니다
Kamil Kiełczewski

1
+1 이렇게하면 텍스트를 항상 읽을 수 있도록 밝음과 채도를 사용하여 임의의 배경색을 쉽게 설정할 수 있습니다.
Osvaldo Maria

27

난이게 좋아: '#' + (Math.random().toString(16) + "000000").substring(2,8)


또는'#' + Math.floor(Math.random()*16777215).toString(16);
모하마드 Anini

@MohammadAnin이 16 자리 중 1 자리로 6 자리 미만을 생성 할 수 있음
James

1
잘못된 색상이 생성 될 수 있습니다. 예를 들면 '#' + (0.125).toString(16).substring(2, 8) === '#2'. 확률이 낮기 때문에 위험합니다 (4096에서 1) 생각하기 때문에 버그가 테스트를 거칠 수 있습니다. ('#' + Math.random().toString(16) + "000000").substring(2, 8)
James

정정 :해야한다'#' + (Math.random().toString(16) + "000000").substring(2,8)
James

25

밝기 제어를 통한 임의의 색상 생성 :

function getRandColor(brightness){

    // Six levels of brightness from 0 to 5, 0 being the darkest
    var rgb = [Math.random() * 256, Math.random() * 256, Math.random() * 256];
    var mix = [brightness*51, brightness*51, brightness*51]; //51 => 255/5
    var mixedrgb = [rgb[0] + mix[0], rgb[1] + mix[1], rgb[2] + mix[2]].map(function(x){ return Math.round(x/2.0)})
    return "rgb(" + mixedrgb.join(",") + ")";
}

1
매우 시원하지만 밝기를 보았을 때 기대했던보다 생생한 색상보다는 '파스텔'을 생성합니다. 아직도 내 속임수에 빠지다!
JayCrossler

난 정말이 하나처럼 당신은 당신의 웹 사이트 색상 팔레트과 조화로 사용자 지정할 수 있기 때문에
엠마누엘 Gianico에게

20
'#'+Math.random().toString(16).slice(-3) // three-numbers format aka #f3c
'#'+Math.random().toString(16).slice(-6) // six-number format aka #abc123

나는 가독성 때문에 이것을 좋아한다
hitautodestruct

1
경우에 Math.random()반환 0.125한 후 결과가 될 것입니다 #0.2(잘못된 컬러) (일부 패딩 대신 슬라이스를 추가해야합니다)
카밀 Kiełczewski

18

에 의해 작성된 기사 JavaScript에서 Random Hex Color Code Generator에 Paul Irish가 는 절대적으로 놀랍습니다. 사용하다:

'#'+Math.floor(Math.random()*16777215).toString(16);

소스 링크는 다음과 같습니다.

http://www.paulirish.com/2009/random-hex-color-code-snippets/


5
이렇게하면 "1fa4c"와 같이 올바르게 구성되지 않은 색상 값이 반환됩니다 (3 자 또는 6 자 필요)
jj_

1
@jj_입니까? 미안 나는 그것을 알아 차리지 못했다. 공유해 주셔서 감사합니다
way2vin

무작위 반환 0.00001후 결과는 #a7(잘못된 색상)
Kamil Kiełczewski

1
'#' + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')
Haytam

17

@Anatoliy가 제공하는 솔루션에 대한 비결은 다음과 같습니다.

밝은 배경 (배경) 만 생성해야했기 때문에 세 가지 문자 (#AAA) 형식으로 이동했습니다.

function get_random_color() {
    var letters = 'ABCDE'.split('');
    var color = '#';
    for (var i=0; i<3; i++ ) {
        color += letters[Math.floor(Math.random() * letters.length)];
    }
    return color;
}

나는 이것이 가벼우면서도 비슷한 색상을 가장 자주 생성 할 것이라고 생각합니다. 임의 색상의 더 스파 스 범위, 나는 아나톨리의 응답이 대부분의 경우 더 나은 @ 생각
larrytech

15

당신이 나와 같은 멍청한 사람이라면 16 진수 등에 대한 단서가 없다면 이것은 더 직관적 일 수 있습니다.

function r() { return Math.floor(Math.random() * 255) }

var color = 'rgb(' + r() + "," + r() + "," + r() + ')';

다음과 같은 문자열로 끝나야합니다. 'rgb(255, 123, 220)'


이 답변은 상단 하나가 될 필요가있다
길 Epshtain

그래도 0을 얻으려면 256을 사용해야합니다.
Lisa Cerilli

13

이것은 Google 검색을 사용하여 쉽게 찾을 수 있습니다.

function random_color(format)
{
    var rint = Math.round(0xffffff * Math.random());
    switch(format)
    {
        case 'hex':
            return ('#0' + rint.toString(16)).replace(/^#0([0-9a-f]{6})$/i, '#$1');
            break;

        case 'rgb':
            return 'rgb(' + (rint >> 16) + ',' + (rint >> 8 & 255) + ',' + (rint & 255) + ')';
            break;

        default:
            return rint;
            break;
    }
}

업데이트 된 버전 :

function random_color( format ){
  var rint = Math.floor( 0x100000000 * Math.random());
  switch( format ){
    case 'hex':
      return '#' + ('00000'   + rint.toString(16)).slice(-6).toUpperCase();
    case 'hexa':
      return '#' + ('0000000' + rint.toString(16)).slice(-8).toUpperCase();
    case 'rgb':
      return 'rgb('  + (rint & 255) + ',' + (rint >> 8 & 255) + ',' + (rint >> 16 & 255) + ')';
    case 'rgba':
      return 'rgba(' + (rint & 255) + ',' + (rint >> 8 & 255) + ',' + (rint >> 16 & 255) + ',' + (rint >> 24 & 255)/255 + ')';
    default:
      return rint;
  }
}

1
아마 그렇게; 하지만 Google 애드워즈 수익이 발생했을 가능성이있는 사이트는 무엇입니까? =)
David는 모니카 복원

2
어느 사이트가 답을 제공합니까? 그들이 당신에게 답을 제공한다면, 그들은 명중을 얻어야합니다.
Funky Dude

1
@FunkyDude 지금이 결과는 구글에서 최고 결과이며 stackoverflow가 존재하는 이유는 구글을 너무 자주 사용하지 않기 때문입니다.)
Akshat


10
var color = "#";
for (k = 0; k < 3; k++) {
    color += ("0" + (Math.random()*256|0).toString(16)).substr(-2);
}

작동 방식에 대한 분석 :

Math.random()*256 0에서 256까지의 임의의 (부동 소수점) 숫자를 얻습니다 (0에서 255까지)
결과 : 116.15200161933899

|0소수점 다음에 스트립을 추가하면 모든 것이 제거됩니다.
예 : 116.15200161933899-> 116

를 사용하면 .toString(16)이 숫자를 16 진수 (기수 16)로 변환합니다.
예 : 116-> 74
다른 예 : 228-> e4

추가 "0"하면 0으로 채워집니다. 최종 결과에는 각 색상에 대해 2 개의 문자가 있어야하므로 하위 문자열을 얻을 때 중요합니다.
예 : 74-> 074
다른 예 : 8-> 08

.substr(-2)마지막 두 문자 만 가져옵니다.
예 : 074-> 74
다른 예 : 08-> 08 (를 추가하지 않은 경우 "0""08"대신 "8"이 생성됨)

for루프는 다음과 같이 생성, 색상 문자열로 각각의 결과를 추가,이 루프 세 번 실행 :
#7408e4


당신은 당신의 답을 살육시켜야합니다.
joce

8

따라서 모든 대답이 훌륭하지만 출력을 조금 더 제어하려고했습니다. 예를 들어, 나는 그늘에 씻겨지지 않은 밝고 생생한 색상을 보장하면서 가까운 흰색 음영을 방지하고 싶습니다.

function generateColor(ranges) {
            if (!ranges) {
                ranges = [
                    [150,256],
                    [0, 190],
                    [0, 30]
                ];
            }
            var g = function() {
                //select random range and remove
                var range = ranges.splice(Math.floor(Math.random()*ranges.length), 1)[0];
                //pick a random number from within the range
                return Math.floor(Math.random() * (range[1] - range[0])) + range[0];
            }
            return "rgb(" + g() + "," + g() + "," + g() +")";
        };

이제 RGB 값을 선택하기 위해 3 개의 임의 범위를 지정할 수 있습니다. 인수없이 호출하고 일반적으로 한 번 지배적 인 그늘로 꽤 생생한 색상을 생성하는 기본 설정을 얻거나 자신의 범위 배열을 제공 할 수 있습니다.


1
Google Map API는 "#FFFFFF"형식의 16 진수 HTML 색상 만 지원합니다.
Valery Viktorovsky

물론, 숫자를 16 진수로 변환하는 것은 매우 간단합니다. nString (16) 만 걸림은 내부 g 함수에서 두 문자 반환 값을 얻기 위해 0을 채워야합니다.
Ollie Edwards

8

최고 답변에 대한 가장 많이 뽑힌 의견은 Martin Ankerl의 접근 방식이 임의의 16 진수보다 낫다는 것을 암시하며 Ankerl의 방법론을 개선하지는 않았지만 JavaScript로 성공적으로 변환했습니다. 나는 이미 거대한 크기의 SO 스레드에 대한 추가 답변을 게시 할 것이라고 생각했다. 왜냐하면 최상위 답변에는 Ankerl 논리의 JS 구현으로 Gist와 연결되는 또 다른 주석이 있고 그 링크는 끊어지기 때문이다 (404). 내가 평판을 가지고 있다면, 내가 만든 jsbin 링크를 간단히 언급했을 것입니다.

// adapted from
// http://jsfiddle.net/Mottie/xcqpF/1/light/
const rgb2hex = (rgb) => {
 return (rgb && rgb.length === 3) ? "#" +
  ("0" + parseInt(rgb[0],10).toString(16)).slice(-2) +
  ("0" + parseInt(rgb[1],10).toString(16)).slice(-2) +
  ("0" + parseInt(rgb[2],10).toString(16)).slice(-2) : '';
}

// next two methods converted from Ruby to JS
// soured from http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/

// # HSV values in [0..1[
// # returns [r, g, b] values from 0 to 255
const hsv_to_rgb = (h, s, v) => {
  const h_i = Math.floor(h*6)
  const f = h*6 - h_i
  const p = v * (1 - s)
  const q = v * (1 - (f * s))
  const t = v * (1 - (1 - f) * s)
  let r, g, b
  switch(h_i){
    case(0):
      [r, g, b] = [v, t, p]
      break
    case(1):
      [r, g, b] = [q, v, p]
      break
    case(2):
      [r, g, b] = [p, v, t]
      break
    case(3):
      [r, g, b] = [p, q, v]
      break
    case(4):
      [r, g, b] = [t, p, v]
      break
    case(5):
      [r, g, b] = [v, p, q]
      break
  }
  return [Math.floor(r * 256), Math.floor(g * 256), Math.floor(b * 256)]
}

// # use golden ratio
const golden_ratio_conjugate = 0.618033988749895
let h = Math.random() // # use random start value
const gen_hex = (numberOfColors) => {
  const colorArray = []
  while (numberOfColors > 0) {
    h += golden_ratio_conjugate
    h %= 1
    colorArray.push(rgb2hex(hsv_to_rgb(h, 0.99, 0.99)))
    numberOfColors -= 1
  }
  console.log(colorArray)
  return colorArray
}

gen_hex(100)

https://jsbin.com/qeyevoj/edit?js,console


7

괜찮은 무작위성.

임의의 색상

`#${crypto.getRandomValues(new Uint32Array(1))[0].toString(16).padStart(8, 0).slice(-6)}`

임의의 알파, 임의의 색상.

`#${crypto.getRandomValues(new Uint32Array(1))[0].toString(16).padStart(8, 0)}`

7

이를 달성 할 수있는 방법은 너무 많습니다. 여기 내가 한 일이 있습니다.

6 개의 임의의 16 진수 (0-F)를 생성합니다

function randColor() {
    for (var i=0, col=''; i<6; i++) {
        col += (Math.random()*16|0).toString(16);
    }
    return '#'+col;
}

매우 짧은 원 라이너

'#'+Math.random().toString(16).slice(-6)

개별 HEX 구성 요소 생성 (00-FF)

function randColor2() {
    var r = ('0'+(Math.random()*256|0).toString(16)).slice(-2),
        g = ('0'+(Math.random()*256|0).toString(16)).slice(-2),
        b = ('0'+(Math.random()*256|0).toString(16)).slice(-2);
    return '#' +r+g+b;
}

과도하게 설계된 16 진 문자열 (XOR 3 출력을 함께 사용하여 색상 형성)

function randColor3() {
    var str = Math.random().toString(16) + Math.random().toString(16),
    sg = str.replace(/0./g,'').match(/.{1,6}/g),
    col = parseInt(sg[0], 16) ^ 
          parseInt(sg[1], 16) ^ 
          parseInt(sg[2], 16);
    return '#' + ("000000" + col.toString(16)).slice(-6);
}

extremley shor one-liner : 랜덤 리턴시 0.125결과는 #0.2(유효하지 않은 색상)
Kamil Kiełczewski

@ KamilKiełczewski 0.125= 3FC0000000000000IEEE 16 진수 3 개의 16 진수는 지수이고 13은 가수입니다. 있다 1 4.5 천조의 가수가 완전히 그렇게 비어 기회. Firefox / Chrome에서 100m 번 테스트했습니다. 당신은 그것을 깨뜨 리려고 노력 하고 있습니다;). Math.random해야 결코 당신에게 0.125를 제공하지 않습니다. 그리고 그렇다면 PRNG에 문제가 있습니다. 이것은 내 문제가 아닙니다. 0.5, 0.25, 0.0625 등과 같은 분수는 쓸모가 없으며 임의성을 포함하지 않습니다. 어쩌면 당신은이 극단적 인 경우에 대한 해결책을 가지고 있습니까? ;)
bryc

'#'+Math.random().toString(16).split('.')[1].slice(-6).padStart(6,0),하지만 저는 이것을 선호 합니다
Kamil Kiełczewski

6

또 다른 임의의 색상 생성기 :

var randomColor;
randomColor = Math.random() * 0x1000000; // 0 < randomColor < 0x1000000 (randomColor is a float)
randomColor = Math.floor(randomColor); // 0 < randomColor <= 0xFFFFFF (randomColor is an integer)
randomColor = randomColor.toString(16); // hex representation randomColor
randomColor = ("000000" + randomColor).slice(-6); // leading zeros added
randomColor = "#" + randomColor; // # added

6

Array.prototype.reduce 매우 깨끗합니다.

["r","g","b"].reduce(function(res) {
    return res + ("0"+~~(Math.random()*256).toString(16)).slice(-2)
}, "#")

오래된 브라우저에는 심이 필요합니다.


크롬 콘솔에서 항상 # 000000을 반환
Kamil Kiełczewski

6

이 간단한 기능을 사용할 수 있습니다

function getRandomColor(){
 var color =  "#" + (Math.random() * 0xFFFFFF << 0).toString(16);
 return color;
}

1
무작위 반환 0.001결과 "#4189"(잘못된 색상 4 자리)
Kamil Kiełczewski


5

사용 별개의-색상을 .

시각적으로 팔레트를 생성합니다 다른 색상 .

뚜렷한 색상 구성이 가능합니다.

  • 팔레트에 몇 개의 색상이 있는지 선택하십시오
  • 색조를 특정 범위로 제한
  • 채도 (채도)를 특정 범위로 제한
  • 밝기를 특정 범위로 제한
  • 팔레트의 일반 품질 구성

3541 줄의 코드. 여기서 다른 답변은 ~ 6-10 줄입니다 ... 누군가 뚜렷한 색상을 고르기 위해 너무 많은 줄을 작성했는지에 감동합니다.
vsync

정말 따기 시각적으로 구별되는 색상은 그냥 무작위 색상 발생기보다 많은 더 수학을 필요로한다.
InternalFX

방금 2 줄로 했어요.이 기능을 수정했습니다 : stackoverflow.com/a/20129594/104380
vsync

그렇게 간단하지 않습니다. 제안 된 독서
InternalFX

고마워, 매우 흥미로운 기사. 내 방법은 항상 동일한 색상을 제공하며 결과는 일관되고 독특합니다. 어떤 상황에서는 인간의 눈에 맞는 무작위로 잘 분산 된 색상이 필요할 수 있습니다.
vsync

3

무작위 16 진수 코드 생성기의 두 가지 버전이 있습니다.


/* Slowest but shortest. */
"#000000".replace(/0/g,function(){return (~~(Math.random()*16)).toString(16);});    

/* Good performance with small size. */
"#"+(function(a,b){while(a--){b+=""+(~~(Math.random()*16)).toString(16);} return b;})(6,"");

/* Remy Sharp provided one that's the fastest but a little bit too long */
(function(h){return '#000000'.substr(0,7-h.length)+h})((~~(Math.random()*(1<<24))).toString(16))


3

이 함수는 두 가지 방법으로 다른 답변보다 뛰어납니다.

HSV 콘에서 20 회 시도 중 어떤 색상이 다른 유클리드 거리와 가장 멀리 떨어져 있는지 확인하여 가능한 한 뚜렷한 색상을 생성하려고 시도합니다.

색조, 채도 또는 값 범위를 제한 할 수 있지만 해당 범위 내에서 가능한 한 뚜렷한 색상을 선택하려고합니다.

그것은 매우 효율적이지 않지만 합리적인 값을 위해 (100 색상을 쉽게 선택할 수있는 사람은 누구입니까?) 충분히 빠릅니다.

JSFiddle 참조

  /**
   * Generates a random palette of HSV colors.  Attempts to pick colors
   * that are as distinct as possible within the desired HSV range.
   *
   * @param {number}    [options.numColors=10] - the number of colors to generate
   * @param {number[]}  [options.hRange=[0,1]] - the maximum range for generated hue
   * @param {number[]}  [options.sRange=[0,1]] - the maximum range for generated saturation
   * @param {number[]}  [options.vRange=[0,1]] - the maximum range for generated value
   * @param {number[][]}[options.exclude=[[0,0,0],[0,0,1]]] - colors to exclude
   * 
   * @returns {number[][]} an array of HSV colors (each HSV color 
   * is a [hue, saturation, value] array)
   */
  function randomHSVPalette(options) {
    function random(min, max) {
      return min + Math.random() * (max - min);
    } 

    function HSVtoXYZ(hsv) {
      var h = hsv[0];
      var s = hsv[1];
      var v = hsv[2];
      var angle = h * Math.PI * 2;
      return [Math.sin(angle) * s * v,
              Math.cos(angle) * s * v,
              v];
    }

    function distSq(a, b) {
      var dx = a[0] - b[0];
      var dy = a[1] - b[1];
      var dz = a[2] - b[2];
      return dx * dx + dy * dy + dz * dz;
    }

    if (!options) {
      options = {};
    }

    var numColors = options.numColors || 10;
    var hRange = options.hRange || [0, 1];
    var sRange = options.sRange || [0, 1];
    var vRange = options.vRange || [0, 1];
    var exclude = options.exclude || [[0, 0, 0], [0, 0, 1]];

    var points = exclude.map(HSVtoXYZ);
    var result = [];

    while (result.length < numColors) {
      var bestHSV;
      var bestXYZ;
      var bestDist = 0;
      for (var i = 0; i < 20; i++) {
        var hsv = [random(hRange[0], hRange[1]), random(sRange[0], sRange[1]), random(vRange[0], vRange[1])];
        var xyz = HSVtoXYZ(hsv);
        var minDist = 10;
        points.forEach(function(point) {
          minDist = Math.min(minDist, distSq(xyz, point));
        });
        if (minDist > bestDist) {
          bestHSV = hsv;
          bestXYZ = xyz;
          bestDist = minDist;
        }
      }
      points.push(bestXYZ);
      result.push(bestHSV);
    }

    return result;
  }

  function HSVtoRGB(hsv) {
    var h = hsv[0];
    var s = hsv[1];
    var v = hsv[2];

    var i = ~~(h * 6);
    var f = h * 6 - i;
    var p = v * (1 - s);
    var q = v * (1 - f * s);
    var t = v * (1 - (1 - f) * s);
    v = ~~(255 * v);
    p = ~~(255 * p);
    q = ~~(255 * q); 
    t = ~~(255 * t);
    switch (i % 6) {
      case 0: return [v, t, p];
      case 1: return [q, v, p];
      case 2: return [p, v, t];
      case 3: return [p, q, v];
      case 4: return [t, p, v];
      case 5: return [v, p, q];
    }
  }

  function RGBtoCSS(rgb) {
    var r = rgb[0];
    var g = rgb[1];
    var b = rgb[2];
    var rgb = (r << 16) + (g << 8) + b;
    return '#' + ('000000' + rgb.toString(16)).slice(-6);
  }

3

이전의 모든 단축 방법은 유효하지 않은 16 진 코드 (5 자리)를 생성합니다. 난 단지 그 문제없이 유사한 기술 우연히 여기 :

"#"+("000"+(Math.random()*(1<<24)|0).toString(16)).substr(-6)

테스트

콘솔에서 이것을 시도하십시오 :

for(i = 0; i < 200; i++) {
    console.log("#" + ("000" + (Math.random()*(1<<24)|0).toString(16)).substr(-6));
}

4
이 코드를 20000 번 실행하고 길이가 7 미만인 경우에만 콘솔에 인쇄하는 for-loop를 만들고 문자열이 6 자 미만인 경우를 찾았습니다. 또한이 코드의 한 가지 문제는 개별 2 자리 색상 코드가 아닌 전체 6 자리 문자열 만 채우는 것입니다. 즉, 녹색 또는 파란색 값보다 빨간색 값이 0 일 가능성이 높습니다.
Erin Heyming

랜덤 리턴 0.00001시 결과는 "#000a7"(유효하지 않은 색상-5 자리)
Kamil Kiełczewski

3

내 버전 :

function RandomColor() {
  var hex = (Math.round(Math.random()*0xffffff)).toString(16);
  while (hex.length < 6) hex = "0" + hex;
  return hex;
}

나는 생각하지 랜덤 0하게 색상하지 random충분히 XD
shrekuu

우리는 randonly에서 hexadecinal 번호를 생성 0하는 방법에 대해 ffffff. 완벽한 균일 분포 입니다. 0은 브라우저 사용 고려 사항 때문에 문자열을 완성하는 것입니다. 이 솔루션을보다 신중하게 살펴보십시오.
Prostakov

나는 귀하의 의견과 관련이없는 몇 가지 조정을했지만 :)
Prostakov

감사합니다. : D
shrekuu


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.