回答編集履歴

2

調整

2023/04/11 10:03

投稿

yambejp
yambejp

スコア115286

test CHANGED
@@ -25,3 +25,53 @@
25
25
  ```SQL
26
26
  select rnd(6);
27
27
  ```
28
+
29
+ # 調整
30
+ ちょっとランダムの精度を上げてみました。
31
+ 同じコードを次に引き渡していくとランダム性はあがるかも
32
+ ```SQL
33
+ create table tbl (id int primary key auto_increment,val varchar(6));
34
+
35
+ drop procedure if exists set_blank;
36
+ delimiter //
37
+ create procedure set_blank(in n int)
38
+ begin
39
+ set @sql:=concat('insert into tbl(val) values(\'\')',repeat(',(\'\')',n-1));
40
+ prepare stmt from @sql;
41
+ execute stmt;
42
+ end
43
+ //
44
+ delimiter ;
45
+
46
+ drop function if exists str_shuffle;
47
+ delimiter //
48
+ create function str_shuffle(t text)
49
+ returns text
50
+ begin
51
+ set @txt=t;
52
+ set @ret='';
53
+ set @pos=0;
54
+ set @u=length(t);
55
+ WHILE @u > 0
56
+ do
57
+ set @pos=1 + floor(rand() * @u);
58
+ set @ret = concat(@ret,mid(@txt,@pos,1));
59
+ set @txt = concat(left(@txt,@pos-1),mid(@txt,@pos+1,@u));
60
+ set @u=@u-1;
61
+ end while;
62
+ return @ret;
63
+ end
64
+ //
65
+ delimiter ;
66
+ ```
67
+ ```SQL
68
+ call set_blank(60000);
69
+ set @a:='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
70
+ update tbl set val=substr(@a:=str_shuffle(@a),1,6);
71
+ ```
72
+ それでもいくつかはだぶりますけど
73
+ ```SQL
74
+ select val,count(*) as cnt from tbl group by val
75
+ order by cnt desc
76
+ ```
77
+

1

調整

2023/04/11 01:48

投稿

yambejp
yambejp

スコア115286

test CHANGED
@@ -1,5 +1,4 @@
1
- 56,800,235,584通りを想定しているということは同じ文字が2度でてもよいという認識ですかね?
1
+ 56,800,235,584通りを想定しているということは同じ文字が2度でてもよいという認識ですかね?(56,800,235,584=62の6乗)
2
- 56,800,235,584=62の6乗
3
2
  まずファンクションを作って
4
3
  ```SQL
5
4
  drop function if exists rnd;
@@ -7,11 +6,11 @@
7
6
  create function rnd(n int)
8
7
  returns varchar(255) DETERMINISTIC
9
8
  begin
10
- set @a="";
11
- set @b=1;
12
9
  if n>255 then
13
10
  set @a=null;
14
11
  else
12
+ set @a="";
13
+ set @b=1;
15
14
  while @b<=n
16
15
  do
17
16
  set @a:=concat(@a,substring('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',ceil(rand() * 62),1));