【问题标题】:unique random number generator problem唯一随机数生成器问题
【发布时间】:2011-04-30 10:12:11
【问题描述】:

我正在尝试制作随机数生成器。但问题是,它以 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;
  }

谢谢, 问候

【问题讨论】:

  • “if (rndValue
  • 什么以0开头?您的数组的索引或结果的范围? (两者都是 obv,但您要更改哪一个?)

标签: javascript random unique


【解决方案1】:

你有一个从 0 到最大值的值,你想要从 1 到最大值?我会建议这个

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

【讨论】:

    【解决方案2】:

    @Nanne 的答案解决了从 0 元素开始的问题,但只要阅读此代码,我建议您也更改您的唯一随机数生成器(尽管我意识到这不是您要问的问题)。

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

    比如说,如果您想在第 9999 个号码上有 10000 个唯一号码,您可能会扫描整个数组数百次,直到找到一个您还没有见过的号码。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-17
      • 2013-03-13
      • 2018-05-03
      • 2016-05-26
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 2020-05-27
      相关资源
      最近更新 更多