Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

最大値と最小値を決めたランダム数値

が必要になったので、再発明感がギラギラだったけどやってみた。
まあ記録的にメモしておく。

use Scalar::Util qw/ looks_like_number /;

sub range_rand {
  my ($max, $min) = @_;

  if (  looks_like_number($max)
    and looks_like_number($min)
  ) {
    if ($max < $min) {
      ($max, $min) = ($min, $max);
    }
    elsif ($max == $min) {
      return int($max);
    }

    my $rand = $min + int(rand($max - $min)) + 1;

    return $rand;
  }

  return;
}

こんな感じか。
ついでにテストスクリプトも。

use strict;
use warnings;
use Test::More;

# 100 times
for (1 .. 100) {
  my $rand = range_rand(100, 80);
  cmp_ok($rand, '>=',  80);
  cmp_ok($rand, '<=', 100);
}

# reverse
for (1 .. 100) {
  my $rand = range_rand(80, 100);
  cmp_ok($rand, '>=',  80);
  cmp_ok($rand, '<=', 100);
}

# same arg
my $same_rand = range_rand(100, 100);
is($same_rand, 100);

# 0
my $zero_rand = range_rand(0, 0);
is($zero_rand, 0);

# no arg
my $no_rand = range_rand();
ok(!defined($no_rand)); 

# invalid arg
my $invalid_rand = range_rand('Hello', 'World');
ok(!defined($invalid_rand)); 

done_testing();

こんな感じかなー。
やっぱり今ひとつ他の人のテストファイルの読み込みが足りない…。


あと調べたら、当然だけど先駆者を発見。
Mysearchhere.comCGI・Perl: PERLで範囲指定でその範囲のランダムを発生