уникальная задача генератора случайных чисел - PullRequest
1 голос
/ 30 апреля 2011

Я пытаюсь сделать генератор случайных чисел. Но проблема в том, что он начинается с 0, но я бы начал с 1

var Found=false
var Current = new Array()
var MaxValue=4 
var NumUnique=3  
var Count=0
var Current = new Array(NumUnique)
GetUnique()

alert("The unique numbers are: " + Current[0] + ", " + Current[1] + ", and " + Current[2])
  function GetUnique()
  {
    for (i=0;Count<NumUnique;Count++)
    {
      Found=false
      var rndValue = get_random()
      var j=0
      for (j=0;j<Current.length;j++)
      {
        if (Current[j] == rndValue)
        {
          Found=true
          break
        }
      }
      if (Found)
      {
        Count--
      } else {
        Current[Count]=rndValue
      }
    }
  }
  function get_random()
  {
    var ranNum= Math.round(Math.random()*MaxValue);
    return ranNum;
  }

спасибо, С уважением

Ответы [ 2 ]

3 голосов
/ 30 апреля 2011

@ Ответ Nanne решает начальный с 0 элемент этого вопроса, но просто читая этот код, я бы посоветовал вам также изменить свой уникальный генератор случайных чисел (хотя я понимаю, что это не тот вопрос, который вы задаете).

Ваш алгоритм в порядке для максимального значения 4 только с 3 уникальными записями, но если вы хотите начать создавать тысячи уникальных записей, ваш алгоритм будет работать очень медленно, чем больше число уникальных чисел вы хотитеполучить (это O (n ^ 2)).

Так, скажем, если вы хотите 10000 уникальных чисел на 9999-м номере, вы будете сканировать весь массив потенциально сотни раз, пока не найдете номер, который еще не видели.

Лучший способ сделать это зависит от того, что вы хотите.Если вы хотите получить случайную последовательность уникальных чисел в диапазоне, то лучше начать с упорядоченного массива растущих значений, а затем просто перемешать этот массив на некоторое время, произвольно меняя значения.Скажем, для n уникальных чисел сделать n случайных перестановок, это O (n).

Если вам нужны случайные числа в очень широком диапазоне, вам нужно сохранить сгенерированные числа в словаре, чтобы вы могли быстро найти, какиечисла, которые вы уже сгенерировали.Я думаю, что это также будет O (n).

3 голосов
/ 30 апреля 2011

У вас есть значение от 0-maxvalue, и вы хотите от 1 до maxvalue?Я бы предложил это

var ranNum= Math.round(Math.random()*(MaxValue-1))+1;
...