我有一个数组和一个函数,可以从这个数组中随机选取元素并将它们显示在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次,那么六个字母中的每一个都会显示两次,并且连续两次显示的字母永远不会相同?
答案 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