More Programming pearls
做习题:用你最喜欢的编程语言实现Floyd算法。
1 - n 中随机取m个数组成集合
1 - n 中随机取m个数组成序列

javascript实现以及证明,更简洁优雅
<script type="text/javascript">
if(!window.console) {
window.console={};
window.console.log=function(v){
alert(v);
};
}
if(!Array.prototype.indexOf) {
Array.prototype.indexOf = function(v){
for(var i=0;i<this.length;i++)
if(this[i] === v) return i;
return -1;
}
}
function randIt(l,u){
return l+Math.floor(Math.random()*(u-l+1));
}
/*
1 - n 中随机取m个数组成集合
*/
function randomSet(m,n) {
var start=n-m+1;
var holder={};
for(var i=start;i<=n;i++) {
//random 1~i not 1~i-1
var cur=randIt(1,i);
if(holder[cur]) {
holder[i]=1;
} else {
holder[cur]=1;
}
}
return holder;
}
/*
1 - n 中随机取m个数组成序列
*/
function randomList(m,n) {
var start=n-m+1;
var holder=[];
for(var i=start;i<=n;i++) {
//random 1~i not 1~i-1
var cur=randIt(1,i);
//trick tick
var position=holder.indexOf(cur)+1;
var insert=position?i:cur;
holder.splice(position,0,insert);
}
return holder;
}
(function main(){
var set=randomSet(5,10);
var t=[];
for(var i in set) {
t.push(i);
}
console.log("*******************Random Set :\n"+t);
var list=randomList(5,10);
console.log("*******************Random List :\n"+list);
})();
/*
证明:
list :
对于任何一个序列,有且仅有一种途径来生成它,因为算法是可以逆推的。
例如M=5,n=10,且最终序列为
7 2 9 1 5
由于 10 (i的最终值)不在s中出现,所以之前的序列为 2 9 1 5,且之前随机数为 7 ,
类似可以推出之前每步产生的随机数,
由于假定随机数的序列是随机产生的,则该程序算法所生成的序列也是随机生成的。
set:
每一个m元集合都有m!的序列生成,序列是等概率的,则集合也是等概率的。
*/
</script>
Java 实现 : 序列随机采样问题
1208

被折叠的 条评论
为什么被折叠?



