首页  > 计算机 >

欧洲的微软win7浏览器选择的随机算法

本文按署名·非商业用途·保持一致授权
作者:  ,发表于2010年03月09日10时00分 

大家都知道,因为欧盟,微软在欧洲的win7操作系统不得不提供多种浏览器选择。在浏览器排序的时候,他们最初使用了类似C的rand(),php的rand(),js的Math.random()来作为排序的比较函数。

function r_sort_func(a,b) {
return rand();
}

这个排序函数的问题在哪里呢?

首先,很可能会导致一个很久的排序循环(还记得冒泡吧);
其次,由于在比较过程中,比较方式是随机的。这不符合排序比较函数的一个要求:算法在同值情况下返回必须始终如一。(其实这点就是导致第一点出现的原因)

如果你希望模拟一下这个随机排序算法,你可以去http://www.robweir.com/blog/attachments/shuffle/shuffle-variable.html测试。

你会发现,某些值(取决于浏览器的实现)会排得很高。

现在,微软修改了这个算法,很简单:
1)在N个里随机(依然借助Math.random())取一个,压到数组底部
2)如果N>0,结束;否则–N,然后回到第一步

这个函数(function ArrayShuffle(a))可以在:http://www.browserchoice.eu/resources/scripts/page.js看到。

如果你想测试但是有没有eu的win7,那么可以在:http://www.robweir.com/blog/attachments/shuffle/shuffle-new.html试试新的算法。

提到这个算法,是因为之前在做听豆的时候,要实现一个随机播放。一开始就是直接用rand()来实现,后来意识到必须保存一个状态,以便在一次播放循环里可以随机到所有歌曲。于是也使用了类似的随机获取算法──就是从N个值里随机取一个。当然我这里并不涉及排序。

最后贴出我的接口:

typedef struct {
unsigned int count;
unsigned int *unused;
unsigned int used_count;
int current_value;
} shuffle_t;
void shuffle_init(shuffle_t *shuffle, unsigned int count);
void shuffle_destroy(shuffle_t *shuffle);
unsigned int shuffle_run(shuffle_t *shuffle);
void shuffle_mark_used(shuffle_t *shuffle,unsigned int removed_value);



一个评论

  1. 第一页:

    不错不错
    学习了一下
    不过感觉你的还是有点复杂

发表评论

  本站文章若无注明,则以署名·非商业用途·保持一致授权
  桂ICP备05004302号 感谢WordPress提供本程序 本模板下载