amd5452 发表于 2007-11-3 09:23:12

javascript 如何生成不重复的随机数

javascript 如何生成不重复的随机数

winter 发表于 2007-11-3 09:25:46

生成的随机数跟前面比一下就行了

amd5452 发表于 2007-11-3 10:13:56

要生成多个  循环来比 的话
6个都循环比一边 如果有与之前重复的
重新生成  再执行 循环 对比 这样写不太好啊 而且  再执行的循环  可以放在一个函数里调用
但是  如果还是重复  再函数在自己调用自己 这样写不行吧

有什么办法没有 。。。  希望能给个简单的例子
我底子比较薄

winter 发表于 2007-11-3 10:22:49

规模小无所谓的 也可以随机选取

月影 发表于 2007-11-3 11:06:06

如果不是生成很多的话,直接生成就好了
因为出现重复的概率是很小的

155120699 发表于 2007-11-3 11:28:59

#3楼是大众化的做法,一般人都会想到这样做的。。。。我也想知道非大众化的做法是怎么样的??

月影 发表于 2007-11-3 11:31:31

非大众化的做法是实现一个离散函数系统输出一串不重复的随机分布数列

suiqirui1987 发表于 2007-11-3 16:52:12

<script>
alert(new Date().getTime())</script>

月影 发表于 2007-11-3 18:12:31

原帖由 suiqirui1987 于 2007-11-3 16:52 发表 http://bbs.51js.com/images/common/back.gif

alert(new Date().getTime())


:L 这个确实不重复但是不随机

(new Date().getTime()) ^ Math.random();

随机且基本上很难重复……

155120699 发表于 2007-11-3 19:48:04

(new Date().getTime()) ^ Math.random();
随机且基本上很难重复,也就是说存在会重复的可能性。。


:lol :lol
那不如这样算了。。随机生成不重复的数字,并且还从大到小排列。。

<script>
function create(n)
{
        var temp=Math.floor(Math.random()*10+n*10);
        while(--n!=0)
        {
                return         temp+","+create(n);       

        }
        if(n==0)
        {
                return temp;
        }

}

alert(create(10));
</script>

月影 发表于 2007-11-3 22:43:59

原帖由 155120699 于 2007-11-3 19:48 发表 http://bbs.51js.com/images/common/back.gif
(new Date().getTime()) ^ Math.random();
随机且基本上很难重复,也就是说存在会重复的可能性。。


:lol :lol
那不如这样算了。。随机生成不重复的数字,并且还从大到小排列。。


function create( ...

从大到小排列那还叫随机:funk: ??

严格随机是指值的统计结果符合随机分布……

剑枫 发表于 2007-11-4 00:01:01

:lol 那就计算下重复的概率

然后多生成几倍随机数

最后排重

dron 发表于 2007-11-4 16:30:30

把进制放大,10 进制换成 62 进制,重复的机率将大大减小,甚至你都不用担心碰撞,
看看以下例子,虽然只是短短的八位,但理论上,218340105584896 次里才会出现一次碰撞,
如果把位数再升高,升到 10 位,就 839299365868340224 次才会出现一次碰撞,所以,可以放心使用


<script type="text/javascript">

function randomWord(n){
    var baseStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    for (var i = 0, r =""; i < n; i++) r += baseStr.charAt(Math.floor(Math.random() * 62));
    return r;
}

alert(randomWord(8));

</script>

dron 发表于 2007-11-4 16:36:30

加大带宽和加大位数是减少碰撞的两个有效手段...

dron 发表于 2007-11-4 16:50:10

月影的代码实际上很容易出现重复的,如果在同一个时间内取 5000 个,那么就出现重复了

请看例子:


<script type="text/javascript">
function rnd() {
    return (new Date().getTime()) ^ Math.random();
}

var rec = {}, x;
for(var i = 0; i < 5000; i ++) {
    x = rnd();
    if (rec["a" + x]) {
        alert("重复了");
        break;
    }
    rec["a" + x] = 1;
}
</script>

155120699 发表于 2007-11-4 18:08:27

Dron的方法是通过加大带宽和加大位数是减少碰撞。。。




你的方法和下面的方法差不多

var a=99999999999999999999999999999999;
var n=a*Math.random();

把a的值不断的加大,这样求出来的n也是几乎很难找到碰撞的。。






怎么样在一个小的数字区间内生成不重复的随机数

比如:生成50-100区间内的不重复随机数,有什么变态的好方法啊??

luohly 发表于 2007-11-5 00:17:58

回复 #16 155120699 的帖子

50-100间就那么几个数字!

dron 发表于 2007-11-5 09:51:40

:L

50-100 顶多 51 种情况,根据抽屉原理,在 52 次内,必至少出现一次碰撞...

sees 发表于 2007-11-5 10:36:41

既然是随机,那就有可能重复,
要不同的值可以用毫秒时间,再根据自己的算法将其转化为字符串,虽然有规律,但不会重复,
你自己的算法别人不知道就可以.比如>>n再md5

155120699 发表于 2007-11-5 10:44:22

大部分人都能想到的大众化方法。。。


生成50-100之间不重复的随机数

<script>
function create(start,end)
{
var arr=new Array();
var nums="";
for(var i=start,j=0;i<=end;i++,j++)
{
arr=i;
}

while(j--)
{

var indexN=Math.floor(Math.random()*arr.length);
nums=nums+arr.splice(indexN,1)+",";
}

return nums
}


alert(create(50,100));  //50-100之间的不重复随机数
</script>
页: [1] 2
查看完整版本: javascript 如何生成不重复的随机数