JavaScript随机加载消息生成器问题

时间:2009-10-07 12:08:13

标签: javascript

我对Javascript知之甚少,而且我写的这个函数似乎没有正常工作。我不知道哪里出错了,只是有时候它不能正常工作。

Any advice on how to improve it?

function GetRandomLoadingMessage() 
{
    var d = new Date();
    var weekday = d.getDay();
    var month = d.getMonth();

    var seed = weekday + "" + year;

    var choice = Math.round(Math.random(seed) * 2);

    if (choice == 1) {
        var lines = new Array(
        "Pay no attention to the man behind the curtain",
        "Follow the white rabbit",
        "The satellite is moving into position",
        "You're not in Kansas anymore",
        "Reticulating Splines",
        "The gods conemplate your fate",
        "It's not you, it's me",
        "So, do you come here often?",
        "Counting backwards from infinity",
        "Rolling for initiative");
    }

    if (choice == 2) {
        var lines = new Array(
        "E.T. phone home",
        "May the force be with you",
        "Here's looking at you, kid",
        "I'm gonna make him an offer he can't refuse",
        "Bond. James Bond.",
        "You're gonna need a bigger boat",
        "I'll be back",
        "Soylent Green is people!",
        "Open the pod bay doors, HAL",
        "Shaken, not stirred");

    }

    if (choice == 3) {
        var lines = new Array(
        "Parallel processors running perpendicular today",
        "Interference from lunar radiation",
        "Positron routers depleted",
        "Borg nanites infesting the server",
        "Astropneumatic oscillations inducing delays",
        "Increased sunspot activity",
        "Packets were eaten by the terminator",
        "Network packets travelling uphill",
        "Trojan horse ran out of hay",
        "Change in the earth's rotational speed");

    }

        return lines[Math.round(Math.random()*(lines.length-1))];

}

您可能已经猜到,这个想法是每天随机地显示来自某个特定“部分”的信息......因此使用种子。虽然我应该改变年份或其他东西。

编辑:好的!谢谢你的信息。我真的需要弄清楚如何使用SEED,就像在C#中一样。有办法吗?每天我都希望它选择一个列表并从该列表中给出响应。通过从日/月的组合播种,我总是可以在给定的一天使用相同的列表。

5 个答案:

答案 0 :(得分:4)

您尚未声明变量year,因此种子值看起来并不像您期望的那样。当转换为在random函数中使用时,它很可能只使用工作日值。您可能打算使用month变量:

var seed = weekday + "" + month;

您的随机计算不正确。您将获得第一个和最后一个项目的一半。您应该使用floor方法而不是round,并乘以更大的值:

var choice = Math.floor(Math.random(seed) * 3);

return lines[Math.floor(Math.random()*lines.length)];

编辑:
当然,选择的值从0到2不等,而不是从1到3。

另外,正如Jon Benedicto在他的回答中所指出的,随机方法不接受任何参数,因此种子值将被忽略。如果您想每天使用随机值,则必须进行自己的伪随机计算。例如:

var now = new Date();
var choice = (now.getDay() * 251 + now.getDate()) % 3;

答案 1 :(得分:2)

根据w3schoolsMath.random()不接受任何参数。是吗?

答案 2 :(得分:1)

首先,您可以通过以下方式播种随机种子:

var n = new Date().getTime();

然后,使用switch语句而不是三个单独的ifs(或if if / elses嵌套):

switch (choice) {
  case 1:
    ...
    break;
  case 2:
    ...
    break;
  case 3:
    ...
    break;
  default:
    ...
}

如果不需要像这样分组,只需在0和列表长度之间选择一个随机数 - 1,然后在数组中返回该索引,你也可以考虑制作一个大的选择数组:

var lines = [...];
function random_line() {
    var r = Math.random();
    var idx = Math.floor( r * (lines.length - 1) );
    return lines[idx];
}

答案 3 :(得分:1)

使用else if并将if (choice == 3)替换为else,以确保始终分配lines

在块外部声明lines(向上移动var lines;)并在代码块中分配lines。否则,当if中的代码块终止时,您将获得被删除的局部变量。

最后,获取Firefox并安装Firebug并查看错误控制台是否存在任何进一步的错误。

答案 4 :(得分:1)

该代码存在一些问题。

  1. Math.random()不接受任何参数,因此您可以删除该播种代码。

  2. 选择将使用0到2之间的数字进行初始化,但您希望它为1到3.简单修复,在分配给选项之前将值加1:

    var choice = Math.round(Math.random()* 2)+ 1;

  3. 不要使用Math.round(Math.random()*(n - 1))来获取随机范围,请使用Math.floor(Math.random()* n)。所以你的2个随机数生成器变为:

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

    返回行[Math.floor(Math.random()* lines.length)];

  4. 就个人而言,我不打扰2个随机数,我将所有行合并为一个数组,并使用一个随机数。