人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Perl/CGIを使って6つの選択肢からランダムに4つを順に選ぶ(1つも重複せずに選ぶ)コードを教えてください。@kouho=(”A”,”B”,”C”,”D”,”E”,”F”);srand(time|$$);$num=rand(5);$kekka=$kouho[$num];とりあえずここまではできたのですが重複せずに4つを選ぶ方法だけがわかりません。

●質問者: musa0
●カテゴリ:コンピュータ 学習・教育
✍キーワード:CGI Perl Rand Time けが
○ 状態 :終了
└ 回答数 : 9/9件

▽最新の回答へ

1 ● alcus
●13ポイント

http://www.be.wakwak.com/~bsd/perl/misc/rand_array.txt

このようなプログラムで、配列の中身の順番をばらばらにして、そのなかの先頭4つを取り出してくる。というのが定番かと思います。

特に項目数が 100,1000 と増えてくると実行時間にかなり効いてきます。

◎質問者からの返答

@kouho=(”A”,”B”,”C”,”D”,”E”,”F”);

srand(time | $$);

$num=rand(5);

$kekka=$kouho[$num];

ここまでは既にできてます。

重複せずに4つを順に選ぶ方法がわかりません。


2 ● sasada
●13ポイント

http://www.hatena.ne.jp/1059209762#

Perl/CGIを使って6つの選択肢からランダムに4つを順に選ぶ(1つも重複せずに選ぶ)コードを教えてください。@kouho=(”A”,”B”,”C”,”D”,”E”,”F”);srand.. - 人力検索はてな

URLはダミーです。

以下のスクリプトで如何でしょうか。

=====================================

#!/usr/bin/perl -w

# 要素が削除されるので注意!!

@kouho=(”A”,”B”,”C”,”D”,”E”,”F”);

srand(time|$$);

$times = $#kouho;

for ( $cnt = 0; $cnt < 4 ; ++$cnt ) {

$num=rand($times + 1);

$kekka=$kouho[$num];

print ”KEKKA = {” . $kekka . ”}¥n”;

splice @kouho,$num,1;

$times = $#kouho;

}

=====================================

◎質問者からの返答

$times = $#kouho;

は何のためにやっているのでしょうか?また

splice @kouho,$num,1;

$times = $#kouho;

の意味はどういうことでしょうか?重複しないための措置でしょうか?


3 ● いのくに
●13ポイント

http://www.rfs.jp/sitebuilder/perl/02/04.html

srand(time|$$);

@array = (”A”, ”B”, ”C”, ”D”, ”E”, ”F”);

@new;

for( @array ){

my $r = rand @new+1;

push(@new, $new[$r]);

$new[$r] = $_;

}

$n = 0;

for( @new ){

print $new[$n].”¥n”;

$n++;

if($n >= 4){

break;

}

}


4 ● sasada
●13ポイント

http://www.hatena.ne.jp/1059209762?

Perl/CGIを使って6つの選択肢からランダムに4つを順に選ぶ(1つも重複せずに選ぶ)コードを教えてください。@kouho=(”A”,”B”,”C”,”D”,”E”,”F”);srand.. - 人力検索はてな

>$times = $#kouho;

>は何のために

すみません、慌てて作ったので、修正ミスです。m(_ _)m

for文の前のその行は削って、for文自体を以下に差し替えてください。

=============================

for ( $cnt = 0; $cnt < 4 ; ++$cnt ) {

$num=rand($#kouho + 1);

$kekka=$kouho[$num];

print ”KEKKA = {” . $kekka . ”}¥n”;

splice @kouho,$num,1;

}

=============================

spliceは、使用済みの配列要素を削除するのに使用しています。

一つ選択するごとに、その要素を削除しているので、重複選択されないという仕組みです。

あと、蛇足ですが、print文は、候補の格納用の処理に置き換えてください。


5 ● alcus
●13ポイント

http://www5c.biglobe.ne.jp/~MOGI/algorithm/algorithm01.htm#SEC4

最初の回答とあわせてみてください。

つまり

1. データーを定義して(”ABCDE”)

2. それの順番をばらばらにして(”EADBC”)

3. 頭から必要個数分とってくると、あたかも「重複せずにランダムに4つ選んでいるように見える」という手法です。

あるいは「つかったかどうか」の配列をもういっこ容易して重複を防ぐ方法ですか。

これは最初の回答の説明にも書いたとおり、項目数が多くなるほど時間がかかる可能性があります。(例:99個使用中で残り1個のとき、ランダムに選ぶと”使用中”がでる確立がすごく高い)

◎質問者からの返答

後者の方です。

できれば前者の方もお教え願いますか?


1-5件表示/9件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ