2014-11-15 2 views
1

http://jsfiddle.net/8ysuw/JQuery: генерировать уникальный случайный цвет, который не был использован уже

Colors.random = function() { 
    var result; 
    var count = 0; 
    for (var prop in this.names) 
     if (Math.random() < 1/++count) 
      result = prop; 
    return { name: result, rgb: this.names[result]}; 
}; 

Я хочу, чтобы убедиться, что тот же цвет не появляется, как только он был назван. В настоящее время он будет продолжать генерировать случайный цвет независимо от того, какой цвет показывает время от времени.

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

ответ

2
Colors.called = {}; 
Colors.random = function() { 
    var keys = Object.keys(this.names), 
     max = keys.length, 
     called = Object.keys(this.called), 
     color = keys[Math.floor(Math.random() * (max - 0)) + 0]; 

    if (Colors.called[color]) { 
     if (max === called.length) { 
      Colors.called = {};  
     } 

     return Colors.random();    
    } 

    Colors.called[color] = true; 
    return { name: color, rgb: this.names[color] }; 
}; 

DEMO: http://jsfiddle.net/8ysuw/75/

1

Вы можете заполнить массив всеми цветовыми кодами/именами (не знаете, какой из них вам нужен) и удалить выбранный элемент перед его возвратом.

var colorFactory = (function() { 
    var allColors = ["red", "green", "blue"]; 
    var colorsLeft = allColors.slice(0); 

    return { 
     getRandomColor: function() { 
      if (colorsLeft.length === 0) { 
       return undefined; 
      } 

      var index = Math.floor(Math.random() * colorsLeft.length); 
      var color = colorsLeft[index]; 
      colorsLeft.splice(index, 1); 
      return color; 
     }, 
     reset: function() { 
      colorsLeft = allColors.slice(0); 
     } 
    }; 
}()); 

// Usage: 
// Get a random color 
var someColor = colorFactory.getRandomColor(); 

// Reset: mark all colors as unused 
colorFactory.reset(); 
Смежные вопросы