タイプウェルって何で重複単語を出す仕様なんだろう

つっこみお待ちしております - 思考停止中
検算してみましたけど問題ないと思います。と自信を持って言えないのがあれですが、不安なときはコードを書くと安心する人種なのでデータで安心しましょう。

# n個の一意な要素のリストからr個無作為に抽出したときに
# 重複が発生しない確率を理論式から求める関数
def prob(n, r):
  result = 1
  for i in range(1,r):
    result *= float(n-i)/n
  return result

# 95%を超えるまでnを100ずつ増やしてチェック
for i in range(100, 20000, 100):
  result = prob(i, 15)
  print "n:%d, r:%d => %f" % (i, 15,result)
  if result > 0.95: break

わりとすぐに飽和しちゃうので90%以上を求めるとnがすごいことになりますね。99%まで上げるには10500個必要です。

n:100, r:15 => 0.331284
n:200, r:15 => 0.583817
n:300, r:15 => 0.700627
n:400, r:15 => 0.766646
n:500, r:15 => 0.808916
n:600, r:15 => 0.838260
n:700, r:15 => 0.859808
n:800, r:15 => 0.876297
n:900, r:15 => 0.889320
n:1000, r:15 => 0.899864
n:1100, r:15 => 0.908576
n:1200, r:15 => 0.915894
n:1300, r:15 => 0.922128
n:1400, r:15 => 0.927502
n:1500, r:15 => 0.932183
n:1600, r:15 => 0.936296
n:1700, r:15 => 0.939938
n:1800, r:15 => 0.943187
n:1900, r:15 => 0.946103
n:2000, r:15 => 0.948734
n:2100, r:15 => 0.951120

もっと直接的に、ランダムにデータをチョイスしたときにどれくらい重複するのか調べたらこんな感じになります。

from random import randint

# n個の一意な要素のリストからr個無作為に抽出する作業を
# test回ナイーブに繰り返したとき、重複が発生しない割合
def dupcheck(n, r, test):
  dup_count = 0
  for i in range(test):
    r_list = [randint(0,n-1) for i in range(r)]
    no_dup = set(r_list) # r_listから重複を排除
    if len(r_list) != len(no_dup):
      dup_count += 1
  return 1 - float(dup_count) / test

# 1000個の要素から15個を取り出す操作を10000回試行
dupcheck(1000, 15, 10000)
=> 0.9031

よさげです。


まぁ、単純に重複しない単語を取り出したい場合は配列をシャッフルして先頭から順番に取り出していくのがいいと思います。

import random
word_list = range(1000) # 0から999までのリストを作成
random.shuffle(word_list) # word_listをシャッフル
test_word_list = word_list[0:15] # 先頭の15個を抽出

こうやって計算でタイピングを分析していくのいいですねっ!いやまぁ僕はコードしか書いてませんけどね。