oracle 存储过程实现上交所新股摇号算法,很有挑战性,存储过程高手进来看看...

遇到一个一个摇号算法,需要用上交所新股摇号算法用存储过程实现,恳请存储过程高手能给点建议,在下在此谢谢大家了

摇号规则如下:
(1) 摇号采取“随机与均衡相结合”的办法,随机摇出中签号码或基本中签号码,然后递增或递减一个相等数,(递增或递减相
等数根据中签率不同而决定递增或递减数不同,如:万分之五,先摇出一个四位数作为基本中签号码,然后递增或递减2000得到其他4个中签号
码,即:10000/5)得出其它的中签号码。
(2) 如中签率为0.05622852%时:先产生万之五的中签号码,接着产生十万分之六的中签,再产生百万分之二的中签号码,接着
再产生千万分之二的中签号码。根据产生的中签号码,计算出中签号码个数,再产生出剩余的中签号码。如遇不能整除的比例数时,则将比例
数拆开。
(3) 一个号码只有一个中签机会,如果后产生的号码(包括尾数)与先前产生的中签号码相同,则将后产生的重复中签号码取消
,即刻按摇号规则摇出新的中签号码。
4、 新股摇号抽签使用怎样的拆分方法
遵循“随机与均衡相结合”的原则进行拆分。
举例如下:
千分之一,即随机摇出一个三位数的中签号码;
千分之二,先摇出一个三位数作为基本中签号码,然后递增或递减500得到另外一个中签号码;
千分之三,拆成千分之一和千分之二,得出方法同上;
千分之四,先摇出一个三位数作为基本中签号码,然后递增或递减250得到另外三个中签号码;
千分之五,先摇出一个三位数作为基本中签号码,然后递增或递减200得到另外四个中签号码;
千分之六,拆成千分之一和千分之五,得出方法同上;
千分之七,拆成千分之二和千分之五,得出方法同上;
千分之八,先摇出一个三位数作为基本中签号码,然后递增或递减125得到另外七个中签号码;
千分之九,拆成千分之四和千分之五(深市新股摇号多采用5+4规则),或拆成千分之一和千分之八(沪市新股摇号多采用8+1规则),得出方
法同上。


-----------------------------------------------------
要求 写个方法 传入中签率 得到摇号号码
例如 0.5 得到 1,3,5,7,9或者2,4,6,8,0 这
0.003 [907、407]、233=== 两组=2+1
0.004 [410、660、910、160]

突然翻到自己以前的博客 这个算法已经实现用java类实现的 我把他贴出来


public static List<List<String>> drawNumber(String sign){

String shu = sign;

int s = shu.indexOf("."); //小数点位置
List <List<String> > ls = new ArrayList<List<String>> (); ;

for(int i = 0;i<shu.length() ; i++){
if(i>s&&!"0".equals( shu.substring(i, i+1))){ // 小数点后面的
int d = i-s ; //离小数点几位
String jishu ="1";
int shuwei = 0 ;
for(int j = 0 ;j<d;j++){
jishu +="0" ;
shuwei ++ ;

}
String fenshu = shu.substring(i, i+1) ;
if( Integer.parseInt(fenshu)==3){ //等于3 拆分1 和2
List<String> l = getRandom(jishu, 1, shuwei);
ls.add(l);
List<String> l2 = getRandom(jishu, 2, shuwei);
ls.add(l2);

}
else if( Integer.parseInt( fenshu)==6){ //等于6 拆分1 和5
List<String> l = getRandom(jishu, 1, shuwei);
ls.add(l);
List<String> l2 = getRandom(jishu, 5, shuwei);
ls.add(l2);
}
else if( Integer.parseInt( fenshu)==7){ //等于7 拆分2 和5
List<String> l = getRandom(jishu, 2, shuwei);
ls.add(l);
List<String> l2 = getRandom(jishu, 5, shuwei);
ls.add(l2);
}
else if( Integer.parseInt(fenshu)==9){ //等于9 拆分1 和8 8+1
List<String> l = getRandom(jishu, 1, shuwei);
ls.add(l);
List<String> l2 = getRandom(jishu, 8, shuwei);
ls.add(l2);
}
else {
List<String> l = getRandom(jishu, Integer.parseInt(fenshu), shuwei);
ls.add(l);
}

}
}
return ls ;

}




/**
* 产生号码队列
* @author moyekongling
* @param jishu :基数 ,fenshu:分数 ,shuwei:数位
*
*/
public static List<String> getRandom( String jishu ,int fenshu , int shuwei){
List < String > ls = new ArrayList<String>();
String haoma = "" ;
//首选产生第一个随机数
for (int i = 1 ; i<=shuwei ; i++){

haoma = String .valueOf((int)(Math.random()*(10)))+haoma;


}
ls.add( haoma.trim());

//再产生其他数
int dz = Integer.parseInt(jishu)/fenshu ;
int qt = 0 ;
for(int j =1 ;j<fenshu;j++){
qt = Integer.parseInt(haoma)+dz*j ;
if(String.valueOf(qt).length()==shuwei){
ls.add(String.valueOf(qt));
}
else{ //如果数位大于基数位则去除位数
String s = String.valueOf(qt);
ls.add(s.substring(1, s.length()));

}
}
return ls ;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值