2011-05-12 611 views
4

我想在Sqlite中生成大小爲N的隨機數集。在sqlite中生成多個隨機數

現在我已經得到了最好是工會組調用到random()這樣

create view random_view as 
select random() 
union select random() 
union select random() 
union select random() 
union select random() 
; 

也許有人有一個更聰明的解決方案,能夠產生N個數字?

回答

2

沒有嘗試,但也許這?鑑於至少N行中的任何表,

SELECT RANDOM() FROM anytable LIMIT ? 

與N.

+0

不錯!只要'anytable'有N行就可以工作。 – Petriborg 2011-05-12 01:36:19

3
create temp table rtab (x integer primary key, v default (random())); 

create temp trigger rtrig 
before insert on rtab 
when new.x > 0 begin 
    insert or replace into rtab (x) values (new.x - 1); 
end; 

PRAGMA recursive_triggers = on; 

insert into rtab (x) values (9); 

sqlite> select * from rtab; 
0|-6742468521271879323 
1|-8020364160821973904 
2|4567559116463208288 
3|5330277995838989553 
4|-9000358059551141276 
5|-7148307065140334921 
6|8156512560793181351 
7|-10751076681323044 
8|-7335834651732027766 
9|6837665741304560539 
sqlite> 
+0

哈!那真是太聰明瞭 – Petriborg 2011-05-12 02:21:21

0

如果需要數百萬行的和有殼/ bash的更換?,它可能是不夠好,這樣說:

echo -e '.import "/dev/stdin" mytable\n'; sleep 0.5 ; for i in {1..10000000}; do echo $RANDOM; done) | sqlite3 my.db

睡眠步驟對於防止sqlite由於緩衝而將第一個數字讀爲SQL命令至關重要。 YMMV

+0

是的,如果你可以運行外部命令,那麼從/ dev/random,perl,python或任何地方獲得一個隨機數很容易。我試圖純粹在SQLite中完成它。不過謝謝。 – Petriborg 2012-10-01 17:35:25

0

您可以使用recursive query

此查詢會生成一個表,1000枚隨機數:

CREATE TABLE test(field1); 

INSERT INTO test 
    WITH RECURSIVE 
    cte(x) AS (
     SELECT random() 
     UNION ALL 
     SELECT random() 
     FROM cte 
     LIMIT 1000 
) 
SELECT x FROM cte;