可以建一张总表,把红球全部放进去,建一个唯一ID,也才一百多万,再用select TRUNC(dbms_random.value(1,MAX(ID)+1)) from dual.呵呵
CREATE OR REPLACE PROCEDURE get_shuangse_num IS red_hao dbms_sql.number_table; bule_hao NUMBER; l_output VARCHAR2(200) :='红球是:'; BEGIN SELECT r_hao BULK COLLECT INTO red_hao FROM ( SELECT LEVEL r_hao from dual CONNECT BY LEVEL<=33 ORDER BY dbms_random.value) WHERE ROWNUM<=6 ORDER BY r_hao;
SELECT b_hao INTO bule_hao FROM ( SELECT LEVEL b_hao from dual CONNECT BY LEVEL<=13 ORDER BY dbms_random.value) WHERE ROWNUM<=1;
FOR i IN 1..red_hao.count LOOP l_output := l_output||red_hao(i)||','; END LOOP;
SELECT LEVEL b_hao from dual CONNECT BY LEVEL<=13 ORDER BY dbms_random.value 这一句要改为16才对,好像是16个的是吧!
declare type tab is table of integer index by binary_integer; v_tab tab; v_num int; v_i int := 0; v_continue boolean := false; begin for i in 1 .. 7 loop v_i := v_i + 1; v_tab(v_i) := 0; end loop; v_i := 0; loop v_num := round(dbms_random.value(1, 36)); v_continue := false; for i in 1 .. 6 loop if v_tab(i) = v_num then v_continue := true; end if; end loop;
if v_continue = false then v_i := v_i + 1; v_tab(v_i) := v_num; if v_i < 7 then dbms_output.put_line('red' || v_i || '=' || v_num); else dbms_output.put_line('blue' || '=' || v_num); end if; end if; exit when v_i = 7; end loop;end;
写过Java的可以供参考,可以修改为PL/SQL存储过程。package net.liugeng.lottery;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Random;
public class Main
{
public static void main(String[] args)
{
// 产生几组随机数,要求一组数中不能有重复的数字
System.out.print("请输入投注注数: ");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int nums = 0;
try
{
nums = Integer.parseInt( br.readLine() );
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
int[][] result;
result = new int[nums][7];
Random rand = new Random();
for(int i = 0; i < nums; i ++)
{
for(int j = 0; j < 6; j ++)
{
int newNum = rand.nextInt(33) + 1;
while(true)
{
boolean flag = true;
for(int k = 0; k < j; k ++)
{
if(newNum == result[i][k])
{
flag = false;
}
}
if(flag == true)
{
break;
}
newNum = rand.nextInt(33) + 1;
}
result[i][j] = newNum;
}
result[i][6] = rand.nextInt(16) + 1;
}
for(int i = 0; i < nums; i ++)
{
System.out.print("第" + (i+1) + "组: 红色球为: ");
for(int j = 0; j < 6; j ++)
{
System.out.print(result[i][j] + " ");
}
System.out.print("蓝色球为: " + result[i][6]);
System.out.println();
}
}}
IS
red_hao dbms_sql.number_table;
bule_hao NUMBER;
l_output VARCHAR2(200) :='红球是:';
BEGIN
SELECT r_hao BULK COLLECT INTO red_hao FROM (
SELECT LEVEL r_hao from dual CONNECT BY LEVEL<=33 ORDER BY dbms_random.value)
WHERE ROWNUM<=6
ORDER BY r_hao;
SELECT b_hao INTO bule_hao FROM (
SELECT LEVEL b_hao from dual CONNECT BY LEVEL<=13 ORDER BY dbms_random.value)
WHERE ROWNUM<=1;
FOR i IN 1..red_hao.count LOOP
l_output := l_output||red_hao(i)||',';
END LOOP;
l_output := LTRIM (l_output,',');
dbms_output.put_line(l_output||' 蓝球是:'||bule_hao);
END;简单SP。
这一句要改为16才对,好像是16个的是吧!
type tab is table of integer index by binary_integer;
v_tab tab;
v_num int;
v_i int := 0;
v_continue boolean := false;
begin
for i in 1 .. 7 loop
v_i := v_i + 1;
v_tab(v_i) := 0;
end loop; v_i := 0; loop
v_num := round(dbms_random.value(1, 36));
v_continue := false;
for i in 1 .. 6 loop
if v_tab(i) = v_num then
v_continue := true;
end if;
end loop;
if v_continue = false then
v_i := v_i + 1;
v_tab(v_i) := v_num;
if v_i < 7 then
dbms_output.put_line('red' || v_i || '=' || v_num);
else
dbms_output.put_line('blue' || '=' || v_num);
end if;
end if;
exit when v_i = 7;
end loop;end;