这个问题已被问过几次,但从未确切地说我是如何需要它的。我正在尝试做类似这样的事情:我有一定数量的span
s,我想给它们每个字体大小在10px到46px之间。 有些可以具有相同的值!允许小数(但我猜测无用,因为浏览器处理“子像素”的方式不同(我被告知))。除此之外,我想要左侧和顶部属性的0到100之间的随机值,但这些值永远不会相同!
我做到了这一点:(从这里借来的SO),但有时价值重叠。
function randomFromInterval(from,to) {
return Math.floor(Math.random()*(to-from+1)+from);
}
$("#question-mark-wrapper > span:not('.the-one')").each(function() {
$(this).css({
"font-size": randomFromInterval(10,36) + "px", // Can be the same value twice
"left": randomFromInterval(0,100) + "%", // Cannot be the same value twice
"top": randomFromInterval(0,100) + "%", // Cannot be the same value twice
});
});
答案 0 :(得分:2)
您需要创建一个数组,其中包含您在该函数范围之外的随机函数中已使用的值。我会在下面做这样的事情(未经测试)。并且您将传递给limitsArray您不希望随机返回的变量。因此,您需要在再次调用之前将任何返回的随机变量推送到limitsArray。
var usedNumbers = new Array();
function randomFromInterval(from, to, limitsArray) {
var randomNumber = Math.floor(Math.random()*(to-from+1)+from);
if ( limitsArray.indexOf(randomNumber) != -1 )
return randomNumber;
else
randomFromInterval(from,to,limitsArray);
}
var randomNumber = randomFromInterval(0,100,usedNumbers);
usedNumbers.push(randomNumber);
答案 1 :(得分:1)
创建一个包含100个元素的数组,如下所示:
var myArray = [];
for (var index = 0; index < 101; index++) {
myArray[index] = index;
}
//...
function randomize(maxIndex) {
var index = randomizeMyNumber(maxIndex);
var returnValue = myArray[index];
myArray[index] = myArray[maxIndex];
return returnValue;
}
每次调用randomize后,减去一个最大指数,即可获得所需的结果。
答案 2 :(得分:0)
保留一个全局变量数组以跟踪使用的数字。
var Alredy_Used = [];
function randomFromInterval(from,to) {
var res= Math.floor(Math.random()*(to-from+1)+from);
if(Alredy_Used.length < (from + to))
{
if(Alredy_Used.indexOf(res) == -1 )
{
Alredy_Used.push(res);
}
else
{
res = randomFromInterval(from, to) ;
}
}
else
{
Alredy_Used = [];
Alredy_Used.push(res);
}
return res;
}
答案 3 :(得分:0)
正如@BrokenGlass所说,你需要一个shuffled数组。首先,这是一个实现:
/**
* Create a shuffled array containing all values of [from, to]
*/
function createShuffledArray(from, to) {
var i = to - from + 1;
var a = Array(i);
while (i) {
var j = Math.floor(Math.random() * i--);
var temp = isNaN(a[i]) ? (i + from) : a[i];
a[i] = isNaN(a[j]) ? (j + from) : a[j];
a[j] = temp;
}
return a;
}
现在你想要创建这样的混洗数组并从那里弹出:
var lefts = createShuffledArray(0, 100);
var tops = createShuffledArray(0, 100);
$("#question-mark-wrapper > span:not('.the-one')").each(function() {
$(this).css({
"font-size": randomFromInterval(10,36) + "px", // Can be the same value twice
"left": lefts.pop() + "%", // Cannot be the same value twice
"top": tops.pop() + "%", // Cannot be the same value twice
});
});