ランダムな文字列生成

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