Without further constraints, why not take a random number, if it's less than 0.5, return a random number between x/y and x; if the first random number exceeds 0.5, return a random number between x and x*y. Something like (untested):
sub r2 {
my ($low, $high) = @_;
$low + rand($high-$low);
}
sub myrand {
my ($x, $y) = @_;
rand() < .5 ? r2($x/$y, $x) : r2($x,$x*$y);
}