给'随机'函数js结构?

时间:2014-04-20 11:54:46

标签: javascript jquery arrays

我有一个数组和一个函数,可以从这个数组中随机选取元素并将它们显示在div中。

我的阵列:

var testarray = [A, B, C, D, E, F];

部分js功能:

var new_word = testarray[Math.floor((Math.random()*testarray.length)+1)];
$("#stimuli").text(new_word);

我的问题是,有没有办法让他们以特定比率/顺序随机挑选? 例如,如果我的函数执行了12次,那么六个字母中的每一个都会显示两次,并且连续两次显示的字母永远不会相同?

2 个答案:

答案 0 :(得分:0)

编辑:

评论中的问题:当然有数百种方法可以解决问题。考虑使用人工智能,数学算法或其他人给出的答案。这取决于你真正想要实现的目标。我刚刚提供了一个易于理解和实施的强大解决方案..

这是另一种(不同的方法),相同的结果,但防止值连续显示两次。

Jsfiddle:http://jsfiddle.net/kychan/jJE7F/ 代码:

function StructuredRandom(arr, nDisplay)
{
    //    storage array.
    this.mVar           =    [];
    this.previous;

    //    add it in the storage.
    for (var i in arr)
        for (var j=0; j<nDisplay; j++)
            this.mVar.push(arr[i]);

    //    shuffle it, making it 'random'.
    for(var a, b, c = this.mVar.length; c; a = Math.floor(Math.random() * c), b = this.mVar[--c], this.mVar[c] = this.mVar[a], this.mVar[a] = b);

    //    call this when you want the next item.
    this.next          =    function()
    {
        //    default value if empty.
        if (this.mVar.length==0) return 0;

        //    if this is the last element...
        if (this.mVar.length==1)
        {
            //    we must give it..
            return this.mVar.pop();

            //    or give a default value,
            //    because we can't 'control' re-occuring values.
            return -1;
        }

        //    fetch next element.
        var element    =    this.mVar.pop();

        //    check if this was already given before.
        if  (element==this.previous)
        {
            //    put it on top if so.
            this.mVar.unshift(element);

            //    call the function again for next number.
            return this.next();
        }

        //    set 'previous' for next call.
        this.previous     =    element;

        //    give an element if not.
        return element;
    };
}

注意:在这个例子中,我们无法完全控制相同的值显示两次..这是因为我们可以控制第一个数字,但是当只剩下一个数字显示时,我们必须给它或显示它的默认值,因此有可能显示相同的值。

祝你好运!


喜欢这个吗?

var arr         =     [1,2,3,4,5,6,7],  //    array with random values.
    maxDispl    =     2,                //    max display.
    arr2        =     init(arr)        //    storage.
;

//    create object of given array.
function init(arr)
{
    var pop = [];

    for (var i in arr)
    {
        pop.push({value:arr[i], displayed:0});
    }

    return pop;
}

//    show random number using global var arr2.
function showRandom()
{
    //    return if all numbers has been given.
    if (arr2.length<1)    return;

    var randIndex=    Math.floor(Math.random()*arr2.length);

    if (arr2[randIndex].displayed<maxDispl)
    {
        document.getElementById('show').innerHTML+=arr2[randIndex].value + ', ';
        arr2[randIndex].displayed++;
    }
    else
    {
        //    remove from temp array.
        arr2.splice(randIndex, 1);

        //    search for a new random.
        showRandom();
    }
}

// iterate the function *maxDispl plus random.
var length  = (arr.length*maxDispl) + 2;
for (var i=0; i<length; i++)
{
    showRandom();
}

jsfiddle:http://jsfiddle.net/kychan/JfV77/3/

答案 1 :(得分:0)

你可能想尝试一个准随机序列。这些序列具有您追求的属性。 http://en.wikipedia.org/wiki/Low-discrepancy_sequence