无忧脚本 » JavaScript & VBScript & DHTML 脚本技术讨论版 » javascript 如何生成不重复的随机数

2007-11-3 09:23 amd5452
javascript 如何生成不重复的随机数

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

2007-11-3 09:25 winter
生成的随机数跟前面比一下就行了

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

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

2007-11-3 10:22 winter
规模小无所谓的 也可以随机选取

2007-11-3 11:06 月影
如果不是生成很多的话,直接生成就好了
因为出现重复的概率是很小的

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

2007-11-3 11:31 月影
非大众化的做法是实现一个离散函数系统输出一串不重复的随机分布数列

2007-11-3 16:52 suiqirui1987
[code]<script>
alert(new Date().getTime())</script>
[/code]

2007-11-3 18:12 月影
[quote]原帖由 [i]suiqirui1987[/i] 于 2007-11-3 16:52 发表 [url=http://bbs.51js.com/redirect.php?goto=findpost&pid=527576&ptid=73468][img]http://bbs.51js.com/images/common/back.gif[/img][/url]

alert(new Date().getTime())
[/quote]

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

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

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

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


:lol :lol
那不如这样算了。。随机生成不重复的数字,并且还从大到小排列。。
[code]
<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>
[/code]

2007-11-3 22:43 月影
[quote]原帖由 [i]155120699[/i] 于 2007-11-3 19:48 发表 [url=http://bbs.51js.com/redirect.php?goto=findpost&pid=527597&ptid=73468][img]http://bbs.51js.com/images/common/back.gif[/img][/url]
(new Date().getTime()) ^ Math.random();
随机且基本上很难重复,也就是说存在会重复的可能性。。


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


function create( ... [/quote]

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

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

2007-11-4 00:01 剑枫
:lol 那就计算下重复的概率

然后多生成几倍随机数

最后排重

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

[code]
<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>
[/code]

2007-11-4 16:36 dron
加大带宽和加大位数是减少碰撞的两个有效手段...

2007-11-4 16:50 dron
月影的代码实际上很容易出现重复的,如果在同一个时间内取 5000 个,那么就出现重复了

请看例子:

[code]
<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>
[/code]

2007-11-4 18:08 155120699
Dron的方法是通过加大带宽和加大位数是减少碰撞。。。




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

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

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






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

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

2007-11-5 00:17 luohly
回复 #16 155120699 的帖子

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

2007-11-5 09:51 dron
:L

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

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

2007-11-5 10:44 155120699
大部分人都能想到的大众化方法。。。


生成50-100之间不重复的随机数
[code]
<script>
function create(start,end)
{
var arr=new Array();
var nums="";
for(var i=start,j=0;i<=end;i++,j++)
{
arr[j]=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>
[/code]

2007-11-5 10:46 js小白
[code]
<script language="javascript">
var arr_1 = new Array();
var rstArr = new Array();
for(var i = 0; i<50; i++)
{
        arr_1[i] = i+51;
}
for(var i = 0; i<50; i++)
{
        var z = Math.floor((50-i)*Math.random());
        rstArr.push(arr_1[z]);
        arr_1.splice(z,1);
}

document.write(rstArr.join("<br>"));

</script>
[/code]

2007-11-5 11:49 dron
呵呵,真有趣,这个问题已经引申出有序数组的洗牌问题了,有兴趣的同学继续玩下去吧~~~:lol


`
[code]
<script type="text/javascript">
    Array.prototype.riffle = function(){
        this.sort(function(){
            return Math.random() > 0.5 ? -1 : 1;
        });
    }

    for(var i = 50, ar = new Array(); i <= 100; i++) ar[i - 50] = i;
    ar.riffle();
    alert(ar);
</script>
[/code]

2007-11-5 12:05 dron
呵呵,以上的洗法似乎会把 50 附近的数总是洗到最后去,我们打扑克时经常多洗一会儿,那就再次一次吧,两次 sort 应该比较行了吧

`
[code]
<script type="text/javascript">
    Array.prototype.riffle = function(){
        var sf = function(){ return 0.5 - Math.random(); }
        this.sort(sf).sort(sf);
    }
    for(var i = 50, ar = new Array(); i <= 100; i++) ar[i - 50] = i;
    ar.riffle();
    alert(ar);
</script>
[/code]

2007-11-5 13:37 月影
嗯,多洗几次就好了……

2007-11-5 13:45 月影
我也来一种洗牌法……
[code]
<script type="text/javascript">
Array.prototype.riffle = function(n){
      for(var i = 0; i < n; i++)
      {
             this.push(this.splice((Math.random() * this.length) | 0, 1));
      }
}
for(var i = 50, ar = new Array(); i <= 100; i++) ar[i - 50] = i;
ar.riffle(1000);
alert(ar);
</script>
[/code]

2007-11-6 11:04 dron
哈哈,随机抽取一张,放到最后去...

2007-11-6 14:10 lola
每次调用一次Math.random()就可以了

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.