0

我想做以下事情,但不确定如何去做。我已经阅读了许多解决方案,但它们似乎不适合我想要的。

请记住,我只有基本的编程经验(20 多年前的一些 C 和 Pascal),并且正在尝试重新学习编程。一些更高级的命令的详细解释会很好。

因此,假设我在文本文件中有一个项目列表,如下所示:

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

我需要在一张桌子上随机滚动 3 次,每次从表格中选择一个元素,具体取决于它出现的范围。一旦选择了该项目,在此过程中就无法再次选择它(即,每次滚动必须导致正在选择的唯一元素)。

即,如果掷出四点,则选择 foo。foo 不能是接下来的两个卷之一。下一个掷骰结果是 11,那是 snafu。无法从最后一卷中挑选出 snafu。

等等等等

然后应该显示选择的项目。

我可以通过在文本文件中将每个元素放在它自己的行中,将文件读入数组,找到数组中元素的总数,然后从数组中随机选择三个项目,使用 for 循环和临时数组来做到这一点删除所选元素的重复项,但这可能会很混乱。

我很欣赏 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 回答