欧洲的微软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);

2010-03-09 14:44:37
不错不错
学习了一下
不过感觉你的还是有点复杂