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 实现 : 序列随机采样问题