首页 > 解决方案 > 使用 math.random 生成随机数,但不重复

问题描述

对于我参与的组织的年度圣诞节活动,我们通常会举行抽奖活动,人们只需参加并在门口获得号码票,就有机会赢得免费奖品。我们使用一个用 Flash 编写的程序(使用 ActionScript 2.0),它利用 math.random 选择一个随机数,并附加一些参数,如下所示:

//maxNr = 999999999999999;


initRandom = function(){
    var nr = Math.ceil(Math.ceil(Math.random()*(maxNr));
    var nrString = "";
    for( var j=0; j<(maxNr.toString().length-nr.toString().length); j++){
        nrString += "0";
    }
    nrString += nr.toString();
    var holder = this.createEmptyMovieClip("holder",1);
    for( i=0; i<maxNr.toString().length; i++ ){
        var mc = holder.attachMovie("number","n"+i,i+10);
        mc._x = i*350;
        mc.anim_mc.gotoAndPlay( Math.floor(Math.random()*9) + 1 );
        this["iv"+i] = setInterval( this, "revealNumber", 2000 + (500*i), nrString.substr(i,1), i );
    }
    // scale (if needed) and center
    if( holder._width > Stage.width ){
        holder._width = Stage.width;
        holder._yscale = holder._xscale;
    }
    holder._x = Stage.width/2 - holder._width/2;
    holder._y = 100;
    // buttons
    back_btn.onRelease = function(){
        for(item in holder){
            holder[item].removeMovieClip();
        }
        gotoAndStop("intro");
    }
}

revealNumber = function( digit, i ){
    clearInterval( this["iv"+i] );
    holder["n"+i].gotoAndStop("done");
    holder["n"+i]["number_txt"].text = digit;
}

initRandom();

stop();

它旨在返回 1 到 1000 之间的随机数,定义如下:

go_btn.onRelease = function(){
    maxNr = Math.max( 1000 , 1 );
    gotoAndStop("random");
}

stop();

它是由我们组织的一位成员编写的,他不幸在这一年去世了,我几乎没有编程知识,但我学得很快,实际上已经修改了一些代码以达到目前的水平。但是,我正在尝试添加一个参数,该参数将禁止该函数重复一个数字,即不包括重新选择已生成的数字。我花了几天时间搜寻任何可能的资源,但只遇到了死胡同。

使用当前采用的方法,是否可以将此参数添加到此现有代码中,我该怎么做?

任何帮助、建议或回复将不胜感激!

标签: arraysflashrandomactionscriptactionscript-2

解决方案


我的 AS2 有点生疏,但我认为下面的脚本解释了大致的想法。您需要一些注册表来记录生成的数字,以便下次生成数字时可以跳过它们。我使用了_global对象,因此这个逻辑甚至超越了以下脚本的多个实例。

// Create an Array to record generated numbers.
// The _global object is always present and can be accessed from anywhere.
if (_global.uniqueNr == undefined)
{
    _global.uniqueNr = [];
}

function initRandom()
{
    var nr;

    do
    {
        nr = Math.ceil(Math.ceil(Math.random()*(maxNr));
    }
    while (_global.uniqueNr[nr] == true);
    
    // Record the newly generated number so it would never drop again.
    _global.uniqueNr[nr] = true;
    
    // At this point you can be sure that "nr" contains a unique value.

推荐阅读