• ベストアンサー

Rubyのrandについて

Rubyを勉強中の初心者です。 「苺 コーヒー 花 美人 宇宙見物」と書いたファイル(sukinamono.txt)があります。 その中からランダムで1項目取り出して表示するスクリプトをつくりたいと思っています。 getsでsukinamono.txtを読み込んで、randを使うのかなと思ったのですが、スクリプトのうまい書き方がわかりません。 どなたかに教えていただければ幸いです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

以下のようにしてください。 ------------------------------------------- # 単語の配列を初期化 words = Array.new # tanogo.txt のオープン File.open("tango.txt","r") do |file| # 1行単位で読み込む while line = file.gets #改行を削除 line.chomp! # wordsへ登録 words << line end end #単語の数を求める kazu = words.length # 乱数(整数)を求める # 0~単語の数-1 の範囲に乱数が収まるようにする word = words[rand(kazu)] print word,"\n" --------------------------------------------- 単語が書いてあるファイルをtango.txtとします。 このスクリプトをtest.rb とします。 スクリプトと単語のファイルは同じディレクトリにおいてください。 コマンドプロンプトで、そのディレクトリに移動し、 そこで ruby -Ks test.rb と入力してください。 毎回、異なる単語が表示されます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

補足要求です。 質問1.テキストファイルには 苺 コーヒー 花 ・・・ のように1行に1単語があるのですか? それとも 「苺 コーヒー 花 美人 宇宙見物」のように 1行に各単語がスペース区切りであるのでしょうか。 質問2.環境はwindowsですか、それともlinuxですか。 質問3.rubyのバージョンは1.9以上ですか? このサイトで質問をする場合は、実行環境とrubyのバージョンは最初に 提示しておいたほうが、回答がつきやすくなります。

mot-nghin
質問者

補足

足りないところがありました。申し訳ないです。 1 一行に一単語です。 2 windowsを使っています。 3 バージョンは1.8.7です。 引き続き回答をお待ちしています。

全文を見る
すると、全ての回答が全文表示されます。
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

>スクリプトのうまい書き方 初心者ということであれば、「うまい」ということよりも、まずは「正しく動く」ということに重きを置いたほうがよいかと。 そのうえで、自分のスクリプトのどこに不明点・不満点があるかを明示したほうが、回答が得られやすいと思います。 まずは今時点で、mot-nghinさんが書かれてるスクリプトを晒してみては。 あと、参考: http://www.google.co.jp/search?hl=ja&q=ruby+array%23sample&lr=lang_ja

mot-nghin
質問者

補足

ご回答ありがとうございます。 書き方がよくなかったですね。 とりあえず今書いているものは以下のとおりです。 array=gets(nil) array[rand(array.length)] puts(array) これを実行してもsample.txtの中身がそのまま出てきてしまい、ランダムに1こ選び出すことができないのです。 どんな風に書けば「sample.txtの中からランダムでひとつ取り出して表示する」ことができるようになるのでしょうか。 *項目が少なければスクリプトにそのまま書いてもいいと思うのですが、膨大な量の項目からランダムでn個取り出したいときに不便なので、選び出す候補を別ファイルに用意して、それを読み込んで実行するようにしたいのです。 引き続き回答をお待ちしています。 よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Rubyのスクリプト

    つぎのようなスクリプトを組みました。これはこれで、動いておりますが、お願いです。 (1)Rubyらしい書き方にするには、どこを改めればよいですか? (2)ref_file=open("myReference.txt") の部分は、 外部のレファレンスを用いて名前を翻訳しているところです。 この部分を、関数呼び出しでやってしまいたい。どのように組みなおせば良いですか? 宜しくお願いいたします。 --------------------- おおまかな説明:ディレクトリ「myData」の中にあるlogファイルをひとつずつオープン。 まず、「Target」という単語を探し、その直後にある単語を掴んで、外部のレファレンスファイル「myReference.txt」からrealNameを持ってくる。 その後、処理-----を実行する。 myPath='C:\myData\' print Dir.getwd,"\n" Dir.chdir(myPath) Dir.foreach(myPath) { |myFileName| if /.log/i =~myFileName file_source_body=open(myFileName, "r") while text=file_source_body.gets do if(/Target (\w+\/)/=~text) then myTargetName=$1 ref_file=open("myReference.txt") # (2)のアイテムの部分 while ref_info=ref_file.gets do (/#{myTargetName}\s(\S+)/i=~ref_info) && (realName=$1) end ref_file.close end end ------- ------- ------- }

  • Rubyでの比較 (Float)

    Ruby初心者です。 簡単な比較を行いたいんですが、エラーが出てしまいます。 ファイルに ex. ruby_test.rb 0 12.3243 32 112.233 0.33123 とあり、このファイルを読み込んで比較しようとしています。 以下のコードで比較しようとしました。 ----------------------------------------------------------- fp = open("c:/ruby_test.txt") aaa = Array.new while line2 = fp.gets line2.chomp! bbb = line2.split(/\t/) aaa << bbb[1] if ( bbb[2] < 1.301029996 ) then       ※11行目 print "aaa\n" elsif ( bbb[2] < 8.164943898 ) then print "bbb\n" elsif ( bbb[2] >= 8.164943898 ) then print "ccc\n" end end fp.close -------------------------------------------- 実行すると ( ※ **** はファイル名 ) C:/ruby/*******.rb:11:in'<': comparison of String with Float failed (Argument Error) というエラーが出ます。 比較する  bbb[2] < 1.301029996  を bbb[2] < "1.301029996" すれば 動きますが、これでは文字列としての比較になってしまいますよね?? Floatは数字として比較するにはどうしたらよいのでしょうか? どなたか宜しくお願いします。

  • Rubyでwebページを取得するとき

    Rubyでwebページを取得してtxtファイルに出力したいと考えています。 URLリストを別ファイルで用意して、それを片っ端から読み込んで表示させるものです。 require 'open-uri' require 'kconv' while url=gets next if url=="\n" page=URI(url).read page=Kconv.tosjis(page) puts(page) end これで成功するのですが、「URLリストにのっているwebページが見つからなかったら飛ばして次のページを取得しにいく」ことを追加したいです。 どう書けばいいでしょうか? 教えていただければ幸いです。 よろしくお願いします。

    • ベストアンサー
    • Ruby
  • php mysql で1レコードをランダムに表示させる方法

    プログラム初心者です。 以下、ご指南頂けると幸いです。 データ ----------------------------------------------- id category  txt 1  1     テキスト1 2  1     テキスト2 3  2     テキスト3 4  1     テキスト4 5  1     テキスト5 6  2     テキスト6 上記のようなデータの中から「category」が「1」のレコードをランダムに1つ抽出したいと思っています。 $cat= 1; $query = "SELECT * FROM テーブル名 ORDER BY rand() LIMIT 1 >= (SELECT category = '$cat' FROM テーブル名)"; 上記のスクリプトですとエラーが出てしまいます。 サブクエリの使い方が現状であまり理解していないのだと思います。 本を見たり、検索したりしてるのですがつまづいて、もうかなりの時間が経っているので質問する事にしました。 どうぞ、よろしくお願いします。

    • ベストアンサー
    • PHP
  • javascript についてご教示くださいませ。

    javascript についてご教示くださいませ。 初心者でございます。 あるサイトでjavascript の見本がありました。 表示されているソースではボタンをおした時に 1つの文字がランダムに表示されます。 これを3✕5(下記のように表示させたい) A B B C D A A A A C B A D D C 乱数で表示させるにはどのように変更したら良いでしょうか? 自分で色々勉強しろというご意見もあると思いますが何卒宜しくお願いいたします。 <form><input type="button" value="クリック" onClick="omikuji()"></form> <script type="text/javascript"> function omikuji() { rand = Math.floor(Math.random()*5); if (rand == 0) msg = "A"; if (rand == 1) msg = "B"; if (rand == 2) msg = "C"; if (rand == 3) msg = "D"; if (rand == 4) msg = "E"; alert(msg); } </script>

  • Rubyでファイルアップローダーにリクエストを送る

    お世話になります。 プログラミング初心者、WindowsXP、Ruby 1.8.5 使用。 http://jp.rubyist.net/magazine/?0013-BundledLibraries 上記のページにある例を真似て、Webサーバ上のファイルアップローダーCGIにリクエストを出すスクリプト(のつもり)を書いてみました。以下自分で書いたコード: require 'net/http' Net::HTTP.start('www.honyara.com',80) {|http| res = http.post('/up.html/upload.cgi',"upload=C:\\test.txt") puts res.body } CGIはPerlで書かれています。これは自分で書いたものではなくてやはり他サイトのパクリなんでorz 自分ではよく理解できてません。 関係あるかどうかわかりませんがCGIのソースではファイルを取得するのにparam()を使っています。upload()ではなくて。 HTMLのCGI部分は次の通りです: <form method="post" action="upload.cgi" ENCTYPE="multipart/form-data">File Name<input type="file" name="upload" size="80"> <input type="submit" value="アップロード"> スクリプトを実行すると実際にサーバ側の指定のフォルダにtest.txtが作成されるが中身は空っぽです。もちろんアップしようとしてるファイルは中身があります。なぜ上手くいかないんでしょうか。そのヒントだけでもいただければ幸いです。

  • アカウントの登録について

    rubyでアカウントがない場合に新しくアカウントを作るプログラムを、ハッシュを使って作成しようと思っています。表示としては登録ができたら「アカウントを作成しました。」と、アカウントがすでにある場合には「アカウントはすでにあります。別なアカウント名を使ってください。」と表示させたいと思っています。ハッシュに登録まではできるのですが、そこからどう作成したらいいのかわからないので教えてほしいです!初心者で申し訳ないですがよろしくお願いします。 $KCODE = "e" hash_account = {} fo = open("accountData.txt", "r") i = 0 while(line = fo.gets) ary = line.split hash_account[ary[0]] = ary[1] i = i + 1 end fo.close ちなみに、accountData.txtにはアカウント名,パスワードの順に登録があります。 rubyのバージョンはruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32]です。

    • ベストアンサー
    • Ruby
  •  茶道の物理学

     湯川秀樹の自伝に「手先が不器用だったので、理論物理学を選んだが、 実験物理学には茶の湯のたしなみが役立つのではないか」という趣旨の 述懐があります。そこで茶道と物理学に詳しい方に質問です。   Q1.最初に一杓の湯で茶碗を清め、惜しげなく捨てるべきか(表裏別)。 (陶磁器は、長く湯通しすると、汚れが戻るのではないか?)  茶碗・茶筅を洗うことが目的なら、ていねいに濯いではどうか。   Q2.茶碗を温めることが目的なら、しばらく湯を温存してはどうか。 (保温効率は、季節によってことなるのではないか?)  寺田寅彦の随筆《茶碗の湯》では、茶道に触れていますか?   Q3.流派にとらわれず、師匠につかず、教室にも通わず、本も買わず、 作法を学べるホームページを紹介してください(道具は揃っています)。 ── 好きなもの イチゴ珈琲花美人 懐手して宇宙見物(寅彦)

  • 【C言語】テキストファイル内のデータを一行削除

    いつもお世話になっております。 ファイル操作についてご教授ください。 sample.txtに下記のデータが格納されています。 【sample.txt】 ------------------- りんご 100円 バナナ 120円 苺 150円 ------------------- この状態で、scanfで「バナナ」と入力し、 sample.txtからバナナの行を削除し、 行を詰めるようにしたいのですが、 どのようにしたらいいのでしょうか。 【流れ】 "文字を入力してください"のメッセージ。   ↓ 「バナナ」と入力。   ↓ ------------------- りんご 100円 苺 150円 ------------------- 上記のように、scanfで入力した「バナナ」の行が削除され、 行が詰められている上状態にしたいです。 超が付くほどの初心者なので、 ソースも書いていただけると幸いです。 どうぞ宜しくお願い致します。

  • C言語 ファイルの指定された行を表示

    こんにちは。 回答お願いします。 今私は作業の高効率化を目指すためプログラムを考えています。 まだぜんぜんできていませんが・・ ファイルの指定された行を表示する関数がないだろうか? もしくは似たような方法はないだろうかと考えています。 できれば例題とともに教えていただければ幸いです。 具体的にどういう風にしたいのかというと ----test.txt------- aaaa bbbbb cccccc dddd eeeeeeee ffffff ------------------- というファイルがあったとしたらgetsで4と入れてやったら 四行目のddddが表示されるようにしたいのです。 まだまだ初心者ですのでさっと考えることができません。 どうかご教授お願いします。