【问题标题】:Unique random number each instance it is called每个被调用的实例的唯一随机数
【发布时间】:2015-02-17 06:55:10
【问题描述】:

我想要一个生成一个从 0.1 到 1 的随机数的变量。在一个函数中,我想多次引用该变量,每个引用都应该生成一个唯一的数字……如果该漫游有意义的话。有些东西一眼就能看出来,但通常是用 C 或其他语言编写的。我在 javascript 中需要这个。

var randoms = Math.floor(Math.random() * 1) + .15;

我这里有这段代码,我在同一个函数中引用它大约 15 次。 每次我都希望数字不同。就目前而言,这会生成一个唯一编号,然后会被使用 15 次。

我知道它一定很简单,因为它是一个简单的概念,但我无法完全理解它。

一些指导会很棒。

也许一些上下文会有所帮助。 在这里,我有一组条形变量,在时间轴上的某个点我需要它们来触发宽度动画,但时间速率不同。

下面的 var randoms 需要针对所有 bar 元素调用的每个实例进行更改。

var bar1 = $('#bar1'),
    bar2 = $('#bar2'),
    bar3 = $('#bar3'),
    bar4 = $('#bar4'),
    bar5 = $('#bar5'),
    bar6 = $('#bar6'),
    bar7 = $('#bar7'),
    bar8 = $('#bar8'),
    bar9 = $('#bar9'),
    bar10 = $('#bar10'),
    bar11 = $('#bar11'),
    bar12 = $('#bar12'),
    bar13 = $('#bar13'),
    bar14 = $('#bar14'),
    bar15 = $('#bar15')
    icon = $('.icon'), 
    randoms = Math.floor(Math.random() * 1) + .15;


    init = new TimelineMax();

    init.add ("chart" , "+=2")
    init.to(icon_1, 0.5, {alpha: '1'})
        .to(icon_2, 0.5, {alpha: '1'})
        .to(icon_3, 0.5, {alpha: '1'})
        .to(icon_4, 0.5, {alpha: '1'})
        .to(bar1, randoms, {width: '100%'},'chart')
        .to(bar2, randoms, {width: '100%'},'chart')
        .to(bar3, randoms, {width: '75%'},'chart')
        .to(bar4, randoms, {width: '90%'},'chart')
        .to(bar5, randoms, {width: '85%'},'chart')
        .to(bar6, randoms, {width: '100%'},'chart')
        .to(bar7, randoms, {width: '75%'},'chart')
        .to(bar8, randoms, {width: '90%'},'chart')
        .to(bar9, randoms, {width: '90%'},'chart')
        .to(bar10, randoms, {width: '70%'},'chart')
        .to(bar11, randoms, {width: '50%'},'chart')
        .to(bar12, randoms, {width: '85%'},'chart')
        .to(bar13, randoms, {width: '80%'},'chart')
        .to(bar14, randoms, {width: '90%'},'chart')
        .to(bar15, randoms, {width: '90%'},'chart');

【问题讨论】:

    标签: javascript jquery random


    【解决方案1】:

    首先,您的代码永远不会产生与0.15 不同的值。您在随机值上调用 Math.floor,它会立即将其转换为 0。要生成 0.1 到 1 之间的数字,请使用:

    var randoms = Math.random() * 0.9 + 0.1;
    

    其次,一旦设置了变量,它就永远不会更新并获得新的值。您需要根据需要多次调用上面的代码。实现此目的的方法之一是将其包装在一个函数中:

    function randoms() {
        return Math.random() * 0.9 + 0.1;
    }
    console.log(randoms());
    

    编辑: 以下是如何使用上述功能:

    function randoms() {
        return Math.random() * 0.9 + 0.1;
    }
    init.to(icon_1, 0.5, {alpha: '1'})
            .to(icon_2, 0.5, {alpha: '1'})
            .to(icon_3, 0.5, {alpha: '1'})
            .to(icon_4, 0.5, {alpha: '1'})
            .to(bar1, randoms(), {width: '100%'},'chart')
            .to(bar2, randoms(), {width: '100%'},'chart')
            .to(bar3, randoms(), {width: '75%'},'chart')
            .to(bar4, randoms(), {width: '90%'},'chart')
            .to(bar5, randoms(), {width: '85%'},'chart')
            .to(bar6, randoms(), {width: '100%'},'chart')
            .to(bar7, randoms(), {width: '75%'},'chart')
            .to(bar8, randoms(), {width: '90%'},'chart')
            .to(bar9, randoms(), {width: '90%'},'chart')
            .to(bar10, randoms(), {width: '70%'},'chart')
            .to(bar11, randoms(), {width: '50%'},'chart')
            .to(bar12, randoms(), {width: '85%'},'chart')
            .to(bar13, randoms(), {width: '80%'},'chart')
            .to(bar14, randoms(), {width: '90%'},'chart')
            .to(bar15, randoms(), {width: '90%'},'chart');
    

    【讨论】:

    • 是的,我刚刚注意到第一个问题,感谢您指出这一点。其次,我试图将它变成一个函数,以便在每次通话时获得一个唯一的号码
    • 天哪,我从没想过使用函数作为时间参数,如此明显——我必须试一试,看看补间引擎是否允许这样做,尽管我看不出为什么.我理解你的意思,并尝试在动画完成后更新 randoms 变量以更改每个实例上生成的数字,但这没有用,现在我必须试试这个。谢谢,不是你关心,而是让你更新。
    【解决方案2】:

    这是一个创建从0.11.0 的随机数的函数:

    var random = Math.floor(Math.random()*11) / 10 ;
    

    Demo

    如果您想创建从 0 到 n 的随机数,请尝试:

    var random = Math.floor( Math.random()* n+1 );
    

    【讨论】:

    • 所以这可以通过将变量放在 for 循环中来实现?
    • 这是不正确的。您的小提琴偶尔会生成 0。
    • 是的,你也可以放定义的变量或者你可以使用静态值。
    【解决方案3】:

    您需要确定需要多少个唯一编号。然后,每次您获得一个号码时,都会将其与您之前的号码匹配以确保唯一性。最后,您将拥有一组独特的数字。对于 0.1 到 1 之间的范围,Math.random() 返回从 0(包括)到 1(不包括)的随机值。避免 0 使用 if 语句。

    var counter = 10;
    var uniqueNumbers = new Array();
    interval = setInterval(function(){
        var x = Number(Math.random().toFixed(1));
        if(uniqueNumbers.indexOf(x) == -1  & x != 0.0){
            uniqueNumbers.push(x);
            console.log(uniqueNumbers);
        }
        if(uniqueNumbers.length == counter){
            clearInterval(interval);
        }
    }, 1);
    

    jsFiddle

    另一种解决方案:

    您还可以将代码包装在一个函数中,并在每次调用该函数时获得一个不同的值。试试下面这段代码,

    HTML:

    <button id="getRandom">Get Unique Number</button>
    

    javaScript:

    var counter = 0;
    var numberLimit = 5;
    var uniqueNumbers = new Array();
    
    getRandom.onclick = function(){
        if(counter != numberLimit){
            CalculateRandom();
        }
    };
    
    function CalculateRandom(){
        var x = Number(Math.random().toFixed(1));
        if(uniqueNumbers.indexOf(x) == -1  & x != 0.0){
            uniqueNumbers.push(x);
            console.log(uniqueNumbers);
            counter++;
        } else if(counter != numberLimit){
            CalculateRandom();
        }
    }
    

    jsFiddle

    [注意: 您也可以随意设置小数位。 ]

    【讨论】:

      【解决方案4】:

      Nikola 提供了我正在寻找的解决方案。除了我在代码中的随机拼写错误——创建一个刷新随机时间变量的函数,然后在动画时间参数所在的位置调用该特定函数的概念,效果非常好。在这种情况下,我使用了 tweenMax,但可以轻松转换为 setInterval 或任意数量的参数,这些参数每次调用时都需要更改一个变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-01
        • 2011-03-18
        • 2018-11-07
        • 2015-10-26
        • 1970-01-01
        • 2010-10-10
        • 1970-01-01
        • 2013-10-31
        相关资源
        最近更新 更多