独特的随机数发生器问题

时间:2011-04-30 10:12:12

标签: javascript random unique

我正在尝试制作随机数生成器。但问题是,它从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 个答案:

答案 0 :(得分:3)

你有一个0-maxvalue的值,你想要1到maxvalue?我建议这个

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

答案 1 :(得分:3)

@ Nanne的答案解决了这个问题的0元素的起点,但只是阅读这段代码我建议你也改变你的独特随机数发生器(虽然我意识到这不是你要问的问题)。

你的算法对于最大值为4只有3个唯一条目是可以的,但是如果你想开始创建数以千计的唯一条目,你的算法运行得非常慢,你想得到的唯一数字的数量就越多(它是为O(n ^ 2))。

所以,比如说,如果你想在9999号上找到10000个唯一数字,你可能会扫描整个阵列数百次,直到你想出一个你还没有看过的数字。

更好的方法取决于你想要什么。如果你想要一个范围内的随机序列的唯一数字,那么最好从一个有序的增加值数组开始,然后简单地将该数组混乱一段时间随机交换值。假设n个唯一数字使得n个随机交换,这是O(n)。

如果您需要非常广泛的随机数,则需要将生成的数字存储在字典中,以便快速查找已生成的数字。我想这也是O(n)。