Javascript 在JS中的循环内返回一个随机数,但绝不相同
这个问题已经被问了好几次了,但从来没有问过我到底需要什么。我正在尝试这样做:我有一个固定数量的Javascript 在JS中的循环内返回一个随机数,但绝不相同,javascript,jquery,random,Javascript,Jquery,Random,这个问题已经被问了好几次了,但从来没有问过我到底需要什么。我正在尝试这样做:我有一个固定数量的spans,我想给它们中的每一个设置一个介于10px和46px之间的字体大小有些可以具有相同的值小数是允许的(但我猜没用,因为浏览器处理“亚像素”的方式不同(我被告知))。除此之外,我希望左属性和顶部属性的随机值介于0和100之间,但这些值永远不能相同 我走了这么远:(从这里借来的),但有时价值重叠 function randomFromInterval(from,to) { return Ma
span
s,我想给它们中的每一个设置一个介于10px和46px之间的字体大小有些可以具有相同的值小数是允许的(但我猜没用,因为浏览器处理“亚像素”的方式不同(我被告知))。除此之外,我希望左属性和顶部属性的随机值介于0和100之间,但这些值永远不能相同
我走了这么远:(从这里借来的),但有时价值重叠
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
});
});
您需要创建一个数组,其中包含已从该函数范围外的随机函数中使用的值。我会做下面这样的事情(未测试)。你会把你不想让随机数返回的变量传递给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);
保留一个全局变量数组以跟踪使用的数字
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;
}
var Alredy_Used=[];
函数randomFromInterval(从,到){
var res=Math.floor(Math.random()*(to-from+1)+from);
如果(使用的总长度<(从+到))
{
if(Alredy_Used.indexOf(res)=-1)
{
Alredy_使用推送(res);
}
其他的
{
res=随机FromInterval(从,到);
}
}
其他的
{
Alredy_Used=[];
Alredy_使用推送(res);
}
返回res;
}
创建一个包含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;
}
var myArray=[];
对于(var指数=0;指数<101;指数++){
myArray[index]=索引;
}
//...
函数随机化(maxIndex){
var指数=随机数(maxIndex);
var returnValue=myArray[index];
myArray[index]=myArray[maxIndex];
返回值;
}
在每次调用randomize之后,减去一个最大索引,就得到了想要的结果。正如@BrokenGlass所说,你需要一个数组。首先,这里是一个实现:
/**
* 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
});
});
只需获取一个值在0到100之间的数组,将数组洗牌,然后依次获取所需的第一个N。我得到以下错误:
uncaughttypeerror:无法调用undefined的方法'indexOf'。我不太明白您在何处以及如何定义limitsArray
。它是函数中的一个参数,因此您可以在函数范围之外创建它来跟踪它。因此,在该函数外部创建一个数组,如var usedElements=new array();将其传递到函数中。然后,每次你得到一个随机变量,像usedElements.push()一样推进到那个usedElements数组中;你能在你的帖子中详细说明一下吗?我真的被卡住了,而且我对数组的使用经验不足,无法做到这一点。谢谢您的努力。对不起,我在试图使createShuffleArray
更具可读性时把它弄糟了,使j
不统一。现在应该纠正了。