ランダムな文字列生成
- ref:http://subtech.g.hatena.ne.jp/secondlife/20070821/1187667574
- ref:http://subtech.g.hatena.ne.jp/secondlife/20070820/1187578797
- ref:http://d.hatena.ne.jp/knagano/20070820/1187621230
- ref:http://d.hatena.ne.jp/knagano/20070821/1187656060
いや、そりゃまぁねぇ。例えば、0 から 1999 までの数字なんかだと半分は先頭 1 で、先頭が 0 になる確率は 1/2000 だ。
で、まぁ、普通に考えて元の生成乱数の範囲を 変えて、先頭の文字を除けばいいんではないかな。
rand(36 ** 9).to_s(36)[1, 8]
h = Hash.new { |h, k| h[k] = 0 } 10000.times do s = rand(36 ** 9).to_s(36)[1, 8] h[s[0, 1]] += 1 end h.keys.sort.each do |k| puts "#{k}: #{h[k]}" end
これならたぶん偏らない。極稀に空文字を生成してしまうけど。
ところで、Python で普通に書くならどうだろう。こうかな。
import string from random import randrange alphabets = string.digits + string.letters def randstr(n): return ''.join(alphabets[randrange(len(alphabets))] for i in xrange(n))
あとどうでもいいかもしれないけど、
(0..8).map{rand(35).to_s(36)}.join
じゃなくて、
(0..8).map{rand(36).to_s(36)}.join
だと思った。まぁ、z が出てこなくなるだけだけどね。
追記
random.choice があることに気づいた。
import string import random alphabets = string.digits + string.letters def randstr(n): return ''.join(random.choice(alphabets) for i in xrange(n))