2017-10-28 79 views
0

根據通過Generex庫的正則表達式獲取隨機字符串。我有一個簡單的代碼來測試「Generex是否生成相同的字符串?」。當我運行這段代碼時,我得到了5000-5300之間的列表大小。使用Generex庫獲取不重複的隨機字符串

public static void main(String[] args) { 
     List<String> stringList = new ArrayList<String>(); 
     for (int i = 0; i < 10000; i++) { 
      Generex generex = new Generex("[a-zA-Z0-9-]*"); 
      String randomString = generex.random(); 
      if (!stringList.contains(randomString)) { 
       stringList.add(randomString); 
      } 
     } 
     System.out.println(stringList.size()); 
    } 

列表的大小意味着Generex生成相同的字符串,並且所有字符串都不是不同的。

我該如何保證Generex將爲每次運行的代碼生成不同的字符串? Generex是否有能力做到這一點?

+0

爲什麼不用'Set'代替'List'來確保你的集合中只有唯一的元素。 – anubhava

+0

當然,Set可以用在這種情況下,但我認爲這種情況沒有效果。因爲Generex生成相同的字符串。我需要防止這一點。 –

回答

0

由於它是Generex Github的頁面上註明的libarary具有多項功能,其中最主要的:

生成隨機字符串匹配的正則表達式這一點。

請注意他們聲稱是隨機的,但不是唯一的

我檢查過他們的源代碼。該庫使用Random類生成的初始僞隨機數來獲得初始值。由於Random不保證唯一性Generex沒有。

該庫的一個有趣的功能是,他們使用以前的關鍵突變來獲得下一個(隨機差異),但在詞彙順序。

準備一個遍歷與正則表達式匹配的所有字符串的迭代器。即使與給定正則表達式匹配的字符串集合是無限的。

所以,你可以使用

Iterator iterator = generex.iterator(); 
    while (iterator.hasNext()) { 
     System.out.print(iterator.next() + " "); 
    } 

要獲得字符串,其中每個下一個字符串是更大的列表(lexographical順序)比前。因此他們將是獨一無二的。

有點更廣泛應用的方式來獲得唯一的字符串(如果你不關心正則表達式)是使用UUID

String uniqueRandom = UUID.randomUUID().toString() 
0

爲什麼你會得到每個運行的代碼不同生成的字符串?您可以使用Generex#getAllMatchedStrings獲取與您的正則表達式匹配的所有不同的字符串(如果存在與正則表達式匹配的無限可能字符串,請避免使用此方法),或者可以使用Generex的迭代器遍歷所有生成的,還可以指定值當您調用Generex#random時將使用它的種子,它有助於重用相同的僞隨機順序。