我有一個數組的數組。現在,我想創建一個不存在於這個數組中的隨機數。如何檢查一個數字不存在於數組中?
my $new_id = int(rand(100000) +10000);
if (grep $_ == $new_id, @existingid) {
# ID already exists
# Create new id and check again
}
如何檢查我的@existingid
陣列中是否存在不存在的號碼?
我有一個數組的數組。現在,我想創建一個不存在於這個數組中的隨機數。如何檢查一個數字不存在於數組中?
my $new_id = int(rand(100000) +10000);
if (grep $_ == $new_id, @existingid) {
# ID already exists
# Create new id and check again
}
如何檢查我的@existingid
陣列中是否存在不存在的號碼?
你已經差不多自己寫的,它已經
整理自己的代碼,並使用any
代替grep
加快速度:
use List::Util 'any';
my $new_id;
while() {
$new_id = 10_000 + int rand 100_000;
last unless any { $_ == $new_id } @existingid;
}
一旦id空間接近滿,這將成爲一個無限循環(甚至接近無限)。 –
#!/usr/bin/perl
use strict;
use warnings;
#create a random number
my $new_id = int(rand(100000) +10000);
while(grep(/^$new_id$/, @existingid) { #condition is true if $new_id is found in array
#found $new_id in @existingid, therefore regenerate and recheck
$new_id = int(rand(100000) +10000);
}
print "new id is: $new_id which does not exist in @existingid\n";
當一個簡單的'$ _ == $ new_id'也可以工作時,似乎使用正則表達式檢查可能會很慢。 –
該算法包含一個BUG。它可以給出一個數組,直到它的一代! – Mike
不要使用數組。使用散列。如果你這麼做很多,每次掃描整個陣列都會讓事情變得緩慢。
my $new_id = int(rand(100000) +10000);
if (exists $hash{$new_id}) {
# ID already exists
# Create new id and check again
}
有這樣的事情的問題是,一個幾乎充滿ID空間意味着你花了很多時間試圖每一個現有的ID,看你找一個是極少數之一您尚未使用的ID。您擁有的ID越多,您生成的隨機ID就越不可能被使用。您的解決方案越糟糕,但您可能不會注意到基本單元和驗收測試。
可能有更好的方法去做你想做的事,但你沒有告訴我們你需要完成什麼。
Errm ..' while(your condition failed){generated random number}' –
@John您應該將其作爲回答,並附帶工作代碼。 – simbabque