`
yiminghe
  • 浏览: 1431720 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

绝妙取样之javascript实现

阅读更多

More Programming pearls

 

做习题:用你最喜欢的编程语言实现Floyd算法。

 

1 - n 中随机取m个数组成集合

1 - n 中随机取m个数组成序列

 

演示@google code

 

 

 

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

 

 

 

  • 大小: 2.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics