最大値と最小値を決めたランダム数値
が必要になったので、再発明感がギラギラだったけどやってみた。
まあ記録的にメモしておく。
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で範囲指定でその範囲のランダムを発生