2016-08-31 41 views
-2

我有一個數組的數組。現在,我想創建一個不存在於這個數組中的隨機數。如何檢查一個數字不存在於數組中?

my $new_id = int(rand(100000) +10000); 
if (grep $_ == $new_id, @existingid) { 
    # ID already exists 
    # Create new id and check again 
} 

如何檢查我的@existingid陣列中是否存在不存在的號碼?

+2

Errm ..' while(your condition failed){generated random number}' –

+0

@John您應該將其作爲回答,並附帶工作代碼。 – simbabque

回答

5

你已經差不多自己寫的,它已經

整理自己的代碼,並使用any代替grep加快速度:

use List::Util 'any'; 

my $new_id; 

while() { 
    $new_id = 10_000 + int rand 100_000; 
    last unless any { $_ == $new_id } @existingid; 
} 
+0

一旦id空間接近滿,這將成爲一個無限循環(甚至接近無限)。 –

0
#!/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"; 
+2

當一個簡單的'$ _ == $ new_id'也可以工作時,似乎使用正則表達式檢查可能會很慢。 –

+0

該算法包含一個BUG。它可以給出一個數組,直到它的一代! – Mike

1

不要使用數組。使用散列。如果你這麼做很多,每次掃描整個陣列都會讓事情變得緩慢。

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就越不可能被使用。您的解決方案越糟糕,但您可能不會注意到基本單元和驗收測試。

可能有更好的方法去做你想做的事,但你沒有告訴我們你需要完成什麼。

相關問題