js关于随机数的小问题

var rand = (parseInt)(Math.random() * 10);
console.log(rand)

这样的一个随机数,每次点击随机生成一个数,随机十次要求内容不重复  ps:我是要一次一次点击点击十次并且不重复,不是循环十次不重复

写个集合 生成的随机数存进去 然后判断下

声明一个set集合,while循环条件set.size()<11,每次生成的随机数放进set里,最后输出set就可以了

通过循环创建变量,每随机一次就赋一次值,下次随机做不相等判断?


<script>   
    var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    function getNumber() { if (arr.length == 0) return '已经取出所有元素'; return arr.splice(parseInt(Math.random() * arr.length), 1)[0]; }
</script>
<div id="dv"></div>
<input type="button" onclick="dv.innerHTML+=' '+getNumber()" value="获取下一个元素" />

//可以一次获取10个不同的随机数字
(function getRand(){
var obj = {};
for(var i=0; i<10; i++){
var rand = (parseInt)(Math.random() * 10);
if(!obj[rand]){
obj[rand] = true;
console.log(rand);
}else{
i--;
}
}
})();

可将数塞入set集合 因为set集合内的元素不允许重复 所以里面的数肯定不相同 判断set.size==10 输出set即可

$("#Gene").click(function(){
var randArr=[];
while(randArr.length<10){
var rand = (parseInt)(Math.random() * 10);
if(randArr.indexOf(rand)<0){
randArr.push(rand);
}

}
$(this).next().text(randArr);
})


// 定义存放生成随机数的数组
var array=new Array();
// 循环N次生成随机数
for(var i = 0 ; ; i++){
// 只生成10个随机数
if(array.length<10){
generateRandom(10);
}else{
break;
}
}
// 循环遍历随机数数组
for(var i = 0 ; i < array.length; i++){
alert(array[i]);
}
// 生成随机数的方法
function generateRandom(count){
var rand = parseInt(Math.random()*count);
for(var i = 0 ; i < array.length; i++){
if(array[i] == rand){
return false;
}

}
array.push(rand);
}

function getNumber(lowerValue,upperValue,quantity){
if(quantity-1>Math.abs(upperValue-lowerValue)){
alert("数字区间不足与取所需数量个数字");
return "数字区间不足与取所需数量个数字";
}
var isExist=[],randomNum=[];
for(var i=0; i<quantity; i++){
var choices = upperValue - lowerValue + 1;
var num = Math.floor(Math.random() * choices + lowerValue);
if(!isExist[num]){
isExist[num]=true;
randomNum[i]=num;
}else{
i--;
}

    }
    return randomNum;
}
var Number=getNumber(0,9,10);//最小数,最大数,多少个数字
console.log(Number);

有很多方法我现在总结两种方法,但是实现过程不同,我相信楼主你代码能力肯定是够了,缺的是思路。
第一种:
随机数的方式,根据需求随机数为1-10的数字,
每次点击后我们将生成的数据存入一个数组的容器里,
每次点击都会将随机出来的数字和数组里的数据遍历对比,
如果都不相同则显示,如果相同就继续随机直到随机一个不相同的数据。
当数组的长度为10的时候就不再随机了。

第二种:
1.先生成1-10的数字放入数组a,
2.获取数组a的长度,
3.然后我们随机出一个小于数组a长度的数字(数组的索引)用来显示,
4.然后我们取出数组a对应索引的数字设为index,
5.移除该索引对应的数据,a=a.splice(index,1); 具体可以看看数组的splice方法
每次点击都执行2-5步即可。

忘楼主采纳,多多思考锻炼思维

提供个思路吧, 一个 0-9 的数组,随机一个数,就把他从数组中去除,随机 去除之后的 数组

声明一个set集合,将数塞入set集合

先给代码:

 var randArr=(()=>{
  var arr=[],len=10,rand,t;
    for(let i=0;i<10;++i) arr.push(i);
    while(len){
      rand=(parseInt)(Math.random()*len--);
        t=arr[rand];arr[rand]=arr[len];arr[len]=t;
    }
    return arr;
 })();
 //使用时用点击次数从randArr取值 或直接randArr.pop()也行

稍微分析下
其实上面说的用数组或set之类的是没错的 特别是@showbo的时空复杂度和咱的一样 比咱的短就很气了
每次生成和原来不一样只能用容器装着判断有没有出现过 空间是O(n)缩不了了
时间这里咱优化到了O(n) 应该是可以继续优化的 不过数据量不大就没意义了
你这个n=10还好 若是数据量大到10^18的话是没辙的

var arr=[];
function xx(){
var rand = (parseInt)(Math.random() * 10);
console.log(rand);
if(arr.length<10){
if(arr.indexOf(rand)<0){
arr.push(rand);
console.log(arr);
}else{
xx()
}
}
};

不知道是不是你想要的,看你的意思应该是取到相同的值自动重新再去取吧!
测试 for(var i=0;i<10;i++){xx();}