odz buffer

2007-08-21

[][]ランダムな文字列生成

いや、そりゃまぁねぇ。例えば、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))

secondlifesecondlife 2007/08/21 17:06 > rand(36)
その通りですね。ご指摘ありがとうございます。

きむら(K)きむら(K) 2007/08/21 17:42 これってIBMが浮動小数点数の基数を16にしてはまった例の現象と根は一緒ですよね?
#って、それがナントカの法則か。

odzodz 2007/08/21 22:18 > secondlife さん
いえいえー。

> きむら(K)さん
む。そんな話があるんですか。知らなかったです。

foobar1117foobar1117 2008/09/21 00:08 ’’.join(random.sample(alphabets),n)
ではいかがでしょう.

odzodz 2008/09/30 23:21 random.sample は同じ要素を取り出さないので得られるデータが異なりますね。
用途によっては問題ないでしょうが。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証