電子書籍の厳選無料作品が豊富!

データベースらしきものを改造中です。
データベースのレコードのうち、ランダムに選んだ4つの情報をトップページに表示したいです。

この「ランダムに選びつつかぶらない方法」と言うのが出来ません。
どのようにしたら実現できますか?

よろしくお願いします。

A 回答 (3件)

こんにちは、



>データベースらしきものを改造中です。
これがどんな物なのか分かりませんが。

以下の様な感じでどうでしょう?

#! /usr/bin/perl
use strict;
use warnings;

my %selected_data_of = ();

while ( scalar keys %selected_data_of < 4 ) {
  my ( $id , $data ) = &get_rand_data();
  $selected_data_of{$id} = $data;
}

foreach my $id ( keys %selected_data_of ) {
  print qq($id = $selected_data_of{$id}\n);
}

sub get_rand_data {
  my $id = int rand(10);
  my $data = qq(data of $id);
  return ( $id , $data );
}

ハッシュのキーはユニークなので、
データベースらしきものから取得したIDをハッシュのキー、
表示したいデータを値としてハッシュに格納して、
ハッシュのキーの数が4つになったら終わり。

ランダムなデータを取得するサブルーチンはスクリプトを動かす為の
意味の無い内容ですから、ご自分の環境で作って下さい。

あと、無限ループにならない対策はご自分でお願いします。
    • good
    • 0

単純に@aの中身を三つ取り出すサンプルプログラムを書きました。

@outに出力結果が入ります。

@a=(1,2,3,4,5);
#設定
$limit=3;#取り出す数
$err="_";#エラーの印
@out=();
#実行
--$limit;#数字調整
if($#a>$limit){#データ数判定
for(;$#out<$limit;){
do{
$r=int(rand()*($#a+1));
}while($a[$r] eq $err);
push(@out,$a[$r]);
$a[$r]=$err;
}
}else{@out=@a;}
print @out;

基本的考え方は、乱数を発生させ、配列のデータを読み込み、@outに入れるのですが、その際にデータをエラーの印($errの中身である[_]のこと。空白にするのもあり。)に上書きし、次回からは配列のデータがエラーの印なら、再度乱数を発生させます。
一度使用した配列のデータを使えなくするというのも、ひとつの手ですね。
一応、saru_1234さんの言う前出と同じならやり直し、を楽に形にしたものだと思ってください。
ちなみに、$#配列名=配列の数です。ただし、配列での数え方のため、中身が五つの場合、数は四つとなります。(零から数えるから。)
ついでに、無限ループの回避は簡単にしているつもりですが、危ないかもしれないで、さらに突っ込んだ回避はがんばってください。たぶん通常なら大丈夫ですが。
    • good
    • 0

2番目以降の選択の時に、


「前出のと同じだったら選択しなおし」とすればよいのでは?

この回答への補足

返答ありがとうございます。

>「前出のと同じだったら選択しなおし」
これはどのようにしたら良いのでしょうか?

補足日時:2007/07/06 14:22
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!