0

以下のことをしたいのですが、やり方がわかりません。私は多くの解決策を読みましたが、それらは私が望むものに合わないようです。

私は基本的なプログラミング経験しかなく (20 年以上前の C と Pascal の一部)、プログラミングを再学習しようとしていることを覚えておいてください。より高度なコマンドのいくつかの詳細な説明は良いでしょう.

たとえば、次のようなテキスト ファイルに項目のリストがあるとします。

1-5,foo
6-9,bar
10-12,snafu
13-14,blam
15,bingo

テーブルをランダムに 3 回ロールする必要があります。そのたびに、要素が出現する範囲に応じてテーブルから要素を選択します。一度そのアイテムを選択すると、このプロセス中に再び選択することはできません (つまり、ロールごとに一意の要素が選択されています)。

つまり、ロールが 4 の場合、foo が選択されます。foo は、次の 2 つのロールのいずれかになることはできません。次のロールの結果は 11 で、これはスナフです。スナフは最後のロールから選ぶことはできません.

などなど

選択されたアイテムが表示されます。

これを行うには、テキスト ファイル内のそれぞれの行に各要素を配置し、ファイルを配列に読み取り、配列内の要素の総数を見つけてから、for ループと一時配列を使用して、配列から 3 つの項目をランダムに選択します。選択した要素の重複アイテムを削除しますが、それは面倒な場合があります。

Java でのソリューションと Perl でのソリューションの両方をいただければ幸いですが、どちらでもかまいません。

理論の本やウェブサイトを読むよりも、実践的な例ややり方を学ぶのが一番です。

コードを投稿していないことはわかっていますが、それは、どこから始めればよいのか、どのように進めればよいのかわからないためです。どんな助けでも大歓迎です。

4

1 に答える 1

0

(言語に依存しない) 解決策の一般的な手順:

まず、アイテムのリストを再フォーマットして、特定の範囲の数値ではなく、各アイテムが重み (つまり、それを選択する数値の数) に関連付けられるようにします。たとえば、サンプル データ セットの場合、次のようになります。

foo,5
bar,4
snafu,3
blam,2
bingo,1

次に、すべての重みを合計し、1 から重みの合計までの乱数を生成します。

次に、各アイテムの重量を差し引いて、リストを調べます。重量が残りの重量よりも大きいアイテムに到達したら、それを選択として記録し、リストから削除します。次に、「すべての重量を合計する」ステップに戻り、必要な数の重量を作るまで繰り返します。選択するか、選択するアイテムが不足しています。

Perl の実装例:

#!/usr/bin/env perl    

use strict;
use warnings;
use 5.010;

my %weight = (
  foo   => 5,
  bar   => 4,
  snafu => 3,
  blam  => 2,
  bingo => 1,
);

my $picks = 3;

while ($picks && %weight) {
  my $total_weight;
  $total_weight += $_ for values %weight;

  my $remaining_weight = rand($total_weight);
  for my $item (keys %weight) {
    if ($remaining_weight < $weight{$item}) {
      say $item;
      $picks--;
      delete $weight{$item};
      last;
    }
    $remaining_weight -= $weight{$item};
  }
}
于 2013-08-27T08:31:31.010 に答える