如何从dict文件中返回随机选择的单词?

时间:2014-08-19 19:21:37

标签: ruby

dict txt文件位于:/ usr / share / dict / words 我需要访问该列表中的单词并随机 put 一个包含4-9个字母的单词供用户使用。

7 个答案:

答案 0 :(得分:3)

pick = words.select { |w| w.size > 3 && w.size < 10 }.sample

答案 1 :(得分:1)

假设单词文件每行包含一个单词:

puts File.read('/usr/share/dict/words').lines.select {|l| (4..9).cover?(l.strip.size)}.sample.strip

答案 2 :(得分:0)

这应该适合你:

file_contents = File.read("/usr/share/dict/words")
words = file_contents.split("\n")
puts words[rand(0..words.size-1)]

答案 3 :(得分:0)

最有效的方法是使用Random

rng = Random.new
words = File.readlines("/usr/share/dict/words")
words.select!{ |e| s = e.size; s >= 4 && s <= 9 }
pick = words[rng(words.size)]

您也可以使用#shuffle,但这会产生一个新列表,所以肯定很重:

words = File.readlines("/usr/share/dict/words")
words.select!{ |e| s = e.size; s >= 4 && s <= 9 }
pick = words.shuffle.first

如果单词未按换行符分隔,请使用split

words = File.read("/usr/share/dict/words").split

答案 4 :(得分:0)

pick = ar.sample until pick.to_s.size.between?(4, 9)

答案 5 :(得分:0)

如果您不需要随机选择给定尺寸范围内的大量单词,这里有一种为速度而设计的方法。

<强>代码

def random_word(fname, size_range, window)
  f = File.open(fname, 'r')
  fsize = f.size
  loop do
    f.seek(rand(fsize)) # Random start byte, likely within a word
    next if f.eof?
    f.readline # Go next word
    window.times do
      break if f.eof
      w = f.readline.strip
      if size_range.cover? w.size
        f.close
        return w
      end
    end
  end
end

<强>实施例

words =
'Now
is
the
time
for 
all
Rubyists
to
do
some
coding'

FNAME = 'dict'
File.write(FNAME,words)

random_word(FNAME, (4..6), 3) #=> "some"
random_word(FNAME, (4..6), 3) #=> "time"
random_word(FNAME, (4..6), 3) #=> "some"

random_word(FNAME, (2..3), 5) #=> "the"
random_word(FNAME, (2..3), 5) #=> "for"
random_word(FNAME, (2..3), 5) #=> "is"

random_word(FNAME, (6..8), 3) #=> "Rubyists"
random_word(FNAME, (6..8), 3) #=> "coding"
random_word(FNAME, (6..8), 3) #=> "coding"

<强>解释

有两种情况需要考虑。

  • 必须一次生成给定长度范围内的大量随机字。在这里构造一个具有限定词的数组然后只是随机选择偏移是有意义的。如果字典没有随着时间的推移而改变,那么可以将这些数组写入文件,对于每个感兴趣的大小范围。

  • 一次只生成适度数量的随机字,或者经常更改所需的大小范围。在这些情况下,在随机选择一个(满足长度要求)之前将字典中的所有单词读成数组将是非常低效的。我已经解决了后一种情况。

算法非常简单:

  • 在字典文件中生成一个随机的偏移量。

  • 将文件指针移动到该字节,该字节可能位于单词的中间。

  • 阅读该行的其余部分(除非已经在文件的末尾)。

  • 读取指定数量的单词(或直到达到文件末尾),搜索指定大小范围内的单词。

  • 如果找到一个单词,则返回该单词,否则将文件指针移动到新的随机偏移量并重复该过程。

从给定的随机文件指针偏移量(在随机移动文件指针之前)中搜索至多给定数量的单词的原因是为了保持随机性,但可能不是很重要。如果此参数实际上是+无穷大,它将从随机位置搜索到文件的末尾,这会略微偏向于靠​​近文件末尾的单词选择。

这种方法确实有一个缺陷:在一些词典中,它偏向于选择单词&#34; aardvark&#34;。

答案 6 :(得分:0)

\r\n

h-100也会移除回车符(即删除html, body { margin: 0; height: 100%; } body { margin: 0; height: 100vh; } html, body { margin: 0; height: 100%; } #console { font-style: italic; })。