如何从斐波那契数列中获得一个随机数

时间:2018-11-01 18:53:09

标签: javascript

我想从斐波那契数列中获得一个随机数:

  

0、1、1、2、3、5、8、13、21、34、55、89、144、233、377、610、987、1597、2584、4181、6765、10946、17711、28657 ,46368,75025,121393,196418,317811,...

这是我的代码:

var number = Math.floor(Math.random() * 100000);
var series_element = -1;
if (number < 1) {
    series_element = 1;
} else {
    if (number < 2) {
        series_element = 2;
    } else {
        if (number < 3) {
            series_element = 3;
        } else {
            if (number < 5) {
                series_element = 5;
            } else {
                if (number < 8) {
                    series_element = 8;
                } else {
                    if (number < 13) {
                        series_element = 13;
                    } else {
                        if (number < 21) {
                            series_element = 21;
                        }
                        ////// series continues to 317811
                    }
                }
            }
        }
    }
}
alert(series_element);

但是我从来没有得到series_element的值小于100。它总是向我显示更高的值。

3 个答案:

答案 0 :(得分:2)

我认为您的意思是您没有从Math.random()函数获得小于100的随机数。因此,您不会使变量series_element小于等于11(斐波纳契数列的前11个项:0 1 1 2 3 5 8 13 21 34 55 89)。

实际上,这是一个概率问题。

  

100/1000000 = 0.0001

如果您继续执行它,则有时会得到小于100的值,大约是10000次的1。

您的代码没有错,但是可以改进它,因此您不必放置太多ifs。

答案 1 :(得分:1)

首先,让我们定义一个函数来计算斐波那契数。有关操作方法的详细信息,请参见:https://medium.com/developers-writing/fibonacci-sequence-algorithm-in-javascript-b253dc7e320e

function fibonacci(num){
  var a = 1, b = 0, temp;
  while (num >= 0){
    temp = a;
    a = a + b;
    b = temp;
    num--;
  }
  return b;
}

要获取随机斐波那契数,您可以使用随机数调用此函数。

var number = Math.floor(Math.random()*100);
var result = fibonacci(number);

我不建议过100,因为您的计算机可能需要太多时间来处理结果...

答案 2 :(得分:0)

您正在使用结构不良的代码来生成fabonacci系列。尝试以下方法,您将获得低于100和1000的价值 其中N是从1N的斐波那契数的位置,而X是实际数。

var n = function getRandomNum() {
     return Math.floor(Math.random()*100) +1;
  }

var result = [];
result[0] = 1;
result[1] = 1;

function fib(x) {
  var ix, ixLen;
  for(ix = 0, ixLen = x; ix < ixLen; ix++){
    if(!result[ix]){
      result[ix] = result[ix-2] + result[ix-1];
    }
  }
  console.log('n:', x, ' result: ', result[ix-1]);
  return result[ix-1];
}
console.log(fib(n()));