テキストファイルからランダムに表示するプログラム

このQ&Aのポイント
  • テキストファイルからランダムに1行の文字を表示するプログラムを作成しました。
  • ランダムに表示する際、同じ行が表示される可能性があるため、それを回避するための改良を行いました。
  • 改良したプログラムでは、重複する行が表示されず、全て異なる行が表示されるようになっています。
回答を見る
  • ベストアンサー

ランダム表示文字について

if ( open( IN,"hoge.txt" ) ) {   @line = <IN>;   close( IN ); } else {   exit; } $random1 = @line[rand(@line)]; $random2 = @line[rand(@line)]; $randam3 = @line[rand(@line)]; テキストファイルから1行文字をランダムに表示するプログラムを書き実行できたのですが、このままだとrandom1,2,3の変数に同じものが入ってしまう可能性があります。 これで全て違うものが入るようなプログラムを書きたいのですが、そのようなことは可能でしょうか?

  • CGI
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • arcsin
  • ベストアンサー率70% (28/40)
回答No.1

if ( open( IN,"hoge.txt" ) ) {   @line = <IN>;   close( IN ); } else {   exit; } splice()関数というのが使って実現してみました。 splice(@line, 5, 1) とすれば、@line,の5番目の1個分の要素を削除することを意味します。そしてこの関数は取り除かれた部分のリストを返します。 こちらで、勝手ながら$randam1等を$randam[1]と配列にしてしまえば、 for($i=1; $i<=3; $i++){ my $n = rand(@line);#乱数 $random[$i] = splice(@line,$n,1); } forループ使わないで、runner_h_aさんのソースの通りランダムに取得する行が3つくらいで少ない場合は、 $random1 = splice(@line,rand(@line),1); $random2 = splice(@line,rand(@line),1); $randam3 = splice(@line,rand(@line),1); でいけると思いますが、動作確認はしてません。

runner_h_a
質問者

お礼

すみません、返事が遅くなってしまいました。 ちょっと動作確認してみますね、ありがとうございます。

関連するQ&A

  • 小文字、大文字、記号をランダム表示

    このプログラムは英大文字をランダムに表示するプログラムなのですが、これを小文字と記号も合わさった形で出力されるように改造するにはどうしたらいいでしょうか。コードを添えて下さると助かります。 import java.util.Random; public class Aruf{ public static void main(String[] args) { //Randomクラスのインスタンス化 Random rnd = new Random(); //変数の宣言 int ran; int a; char c; //10回繰り返す for(int b=0;b<10;b++){ //0~25の乱数を作成 ran = rnd.nextInt(26); //65を足して65~90にする a = 65 + ran; //charに型変換 c = (char)a; //表示 System.out.print(c); } } }

    • ベストアンサー
    • Java
  • 初心者で、困っています。(文字化け)

    すみません、すごく初歩的なことで困っています。 本を見ながら、下のようなものを書いたのですが、 出力すると、文字化けをしてしまいます。ウィンドウズの環境で、Perlは5.8を使い、読み込みのテキストはUnicodeです。どのようにすれば、文字化けをしないで、読み込めるのでしょうか。 open ( IN , "LBa3_00028.txt" ) or die; open ( out , ">out.txt" ); while ( $line = <IN>){ print out "$line\n"; } close(out); close(IN);

    • ベストアンサー
    • Perl
  • ランダム表示について

    ランダム表示について煮詰まってしまって 何とか改善したく思い書き込ませていただきました。 --------------------------------- 表示結果 --------------------------------- データ1 test02 データ2 sample02 データ1 test01 データ2 sample01 データ1 test05 データ2 sample05 データ1 test02 データ2 sample02 --------------------------------- 表示結果がどうしても被ってしまって これを何とか被らないようにしたく 色々模索したのですが解決策が見つかりません。 csvの中身とソースは下記となります。 test.csv --------------------------------- test01 sample01 test02 sample02 test03 sample03 test04 sample04 test05 sample05 test06 sample06 test07 sample07 --------------------------------- ソース --------------------------------- <?php $handle = fopen("test.csv", "r"); while (($data= fgetcsv($handle, 1000, ",")) !== FALSE) { $line[]= $data; } fclose($handle); for($i=0;$i<5;$i++){ $rand= rand(0,count($line)-1); print <<<eof データ1{$line[$rand][0]}<br> データ2{$line[$rand][1]}<br><br> eof; } ?> --------------------------------- 毎ループ、総データ数から一つランダムで選ぶ処理になっているのが原因だと思うのですが その部分を改善しようと調べては試しての繰り返しをしているのですが 一向に改善しません。。。。 どなたかアドバイスを頂ければと思います。 宜しくお願い致します。

    • 締切済み
    • PHP
  • ランダムリンクCGIをPHPへ

    質問させていただきます。 ランダムリンクのCGIがあるのですがこれを機能は変えず同じ動作をするPHPに変えたいのです。以下にCGIの内容を書きます。  ↓ ファイル名 rand_link.pl #!/usr/local/bin/perl ############################################################################## # Random Link Version 1.0 # # Copyright 1996 Matt Wright mattw@scriptarchive.com # # Created 7/15/95 Last Modified 7/30/95 # # Scripts Archive at: http://www.scriptarchive.com/ # ############################################################################## # COPYRIGHT NOTICE # # Copyright 1996 Matthew M. Wright All Rights Reserved. # # # # Random Link may be used and modified free of charge by anyone so long as # # this copyright notice and the comments above remain intact. By using this # # code you agree to indemnify Matthew M. Wright from any liability that # # might arise from it's use. # # # # Selling the code for this program without prior written consent is # # expressly forbidden. In other words, please ask first before you try and # # make money off of my program. # # # # Obtain permission before redistributing this software over the Internet or # # in any other medium. In all cases copyright and header must remain intact.# ############################################################################## # Define Variables $linkfile = "database.txt"; # Options $uselog = 1; # 1 = YES; 0 = NO $logfile = "/home/scriptarchive/demos/links/rand_log"; $date = `date +"%D"`; chop($date); # Done ############################################################################## open (LINKS, "$linkfile"); srand(); # kick rand $nlines=@file=<LINKS>; # inhale file & get # of lines print "Location: $file[int rand $nlines]\n\n"; # print a random line close (LINKS); if ($uselog eq '1') { open (LOG, ">>$logfile"); print LOG "$ENV{'REMOTE_HOST'} - [$date]\n"; close (LOG); } exit; ↑ database.txtにhttp://www.gac.jp/などを1行ずつ改行で書き、HTMLに<a href="rand_link/rand_link.pl">★ </a>を埋め込みクリックのたびにランダムリンクさせる。(携帯対応) PHP改造の知識がまったくないので自分ではどうにもできないです、、どうかよろしくお願いします。

  • includeでのローカルファイルの呼び出しについて

    いろいろやってみて原因が全くわからなかったので、わかる方はご回答願えますと幸いです。 PHPでランダムで文字を表示するスクリプトを作り、下記のように設置して問題なく表示出来ていました。(右の数字はパーミッションです) /home(755) │└index.php(644) /random(755)  ├random.php(644)  └random.txt(606) random.phpでrondom.txt内のデータをランダムに取り出して表示させ、その内容をindex.phpに <? include("http://xxxxx.xxx/random/random.php");?> と呼び出しを行っていました。 しかしサーバー管理者に外部ファイルの呼び出しは高負荷がかかるのでローカルからの呼び出しに変更してほしいと連絡を受け、 <? include("./random/random.php");?> のように修正を行ったところ、以下のようなエラー文が吐き出されてしまいました。 Warning: file(random.txt) [function.file]: failed to open stream: No such file or directory in /xxxxxxxx/random/random.php on line 2 このエラーの回避方法についてご存じの方がいたらご教授願えればと思います。

    • ベストアンサー
    • PHP
  • ランダムの比較について

    今ランダムで数字を選ぶプログラムを作っています。 4つの変数に全て異なる数字を入れたいのですが どうやって比較をすれば良いのか分かりません。 while(true){ $rd1 = rand(0,30); $rd2 = rand(0,30); if($rd1 != $rd2){ break; } } 一応二つの比較ならこれで良いのかと思うのですが 3つ以上になった場合にどういう風にすれば良いのか教えてください。 どうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • ファイルの最後の行から表示させる(最新情報を5回分だけ表示)

    ファイルの最後に1行追加し、6行以上になるとファイルの先頭を1行削除。 表示は最後の行から行うスクリプトを作りたいのです。 新しい情報を5回分だけ表示する様にしたかったのですが、余りにも力技なのでもう少しスマートにやる方法を教えてもらえませんか? ----sort.txt---- 1a 2b 3c 4d ---------------- #!/usr/bin/perl $fname = "sort.txt"; print "Content-type: text/html;\n\n"; $aaa="5e"; open(OUT, ">>$fname"); flock(OUT, LOCK_EX); print OUT "$aaa\n"; flock(OUT, LOCK_NB); close(OUT); open(IN, "$fname"); $cnt = "0"; while($line = <IN>){ $a[$cnt] = "$line"; $cnt++; } close(IN); if($cnt > 5){ open(OUT, ">$fname"); flock(OUT, LOCK_EX); $cnt = "0"; while($cnt < 6){ if($cnt > 0){ print OUT "$a[$cnt]"; } $cnt++; } flock(OUT, LOCK_NB); close(OUT); } $cnt = "0"; open(OUT, "$fname"); @buff = <OUT>; close(OUT); foreach $line ( reverse @buff ){ $cnt++; print "$line<br>\n"; } exit();

    • ベストアンサー
    • Perl
  • 解説お願いします。

    知り合いからソースをもらったtxtファイルのランダム取得なのですが どういう動きをしているのかさっぱりなので誰か解説をお願いします。 このソースをくれた人に聞けば早いのですが連絡が取れなくなってしまったので^^; //index側のソース //ランダム表示 $sorce_dir = './hide_pc/rand_index_top'; @include_once('./hide_pc/randam_k.php'); } //./hide_pc/randam_k.php側のソース <?php //$sorce_dir ソースの入ったディレクトリ mt_srand((int)(microtime() * 10000)); $rand_text = array(); $i = 1; if ($handlerDir = opendir($sorce_dir)){ while ($filename = readdir( $handlerDir )){ if ( $filename != "." && $filename != ".."){ array_push($rand_text,$filename); $i++; } } } $rand = mt_rand(0,(count($rand_text) - 1)); $randam_sorce = file_get_contents($sorce_dir.'/'.$rand_text[$rand]); ?> このソースを用意して./hide_pc/rand_index_topのディレクトリにtxtファイルをアップすれば<?=$randam_sorce ?>と指定したところに表示されます 解説よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 文字列を指定して,別のファイルでその文字列が存在する行を出力する

    いつもお世話になっております. 環境はWindows XP Pro でActiveperlを用いてプログラムをしております. この度,皆様にご意見をうかがいたいのは,「文字列を指定して,別のファイルでその文字列が存在する行を出力する」という内容です. まず,以下のテキストファイルがあります. data.txt ---------------------- A BA C DA E FA G sansyo.txt ----------------------------- B D F ------------------------------- 処理として,data.txtでsansyo.txtの行が "含まれる"行数を出力する ------------------------------- output.txt ------------------------------- 2 4 6 ここで自分なりにプログラムを組んでみました. ----------------------------------- open(FILE, "sansyo.txt"); open(FILE2,"data.txt"); @file = <FILE>; close(FILE); @file2 = <FILE2>; close(FILE2); foreach $line (@file) { foreach $line2 (@file2) { if ($line =~ $line2){ $hit = $.; } open(NEWFILE, " >> output.txt") or die "$!"; print NEWFILE $hit; close(NEWFILE); } } #ここまで ------------------------------------- ですが,永久ループに入ってしまったようにファイルはできるのですが, 出力されてきません. 間違っている点をご指摘ください.

    • ベストアンサー
    • Perl
  • Bシェルで不定変数名を変数として取り扱うには

    ファイル(test.txtとします)に 0755 $HOGE/herehere $FOO/bar のような形で変数を示す文字列がはいっています。 どんな変数名かは事前にわかりません。 これをシェルプログラムで、 $が付いていたら変数名と解釈して使用したいです。 どんな変数名がファイルに含まれているかがわかっているなら、 以下のようにできたのですが、 変数名が不明のときにはどうしたらファイルに含まれている変数を そのまま使用できるのでしょうか。 HOGE=`command HOGE` #HOGEを引数にcommandコマンドを呼び出した結果を$HOGEとする FOO=`command FOO` #↑test.txtの中には$HOGEや$FOOが何度も出てくるので、 #出てくるたびにcommandコマンドを使うのは避けたい。 while read LINE do  FILE=`echo $LINE|sed "s%"'$HOGE'"%$HOGE%g"` done < /test.txt

専門家に質問してみよう