2017-07-31 167 views
0

我在我的Python代码中使用随机生成器。我想获得在随机(0:10^8)等大范围内生成的唯一随机数的百分比。我需要生成10^12个数字在空间复杂度方面,什么是高效算法? 代码类似于:获取随机生成器生成的百分比唯一编号

import random 
dif = {} 
for i in range(0,1000): 
    rannum = random.randint(0,50) 
    dif[rannum] = "True" 
dif_len = len(dif) 
print dif_len 
per = float(dif_len)/50 
print per 
+0

独特的或不同?在{1,2,1,3}组中有3个不同的项目(1,2,3)和2个唯一的(非重复的)项目(2和3)? –

+0

@AkiSuihkonen:我想对不同的数字进行操作 – NGB

+1

使用一个位数组。您的范围需要12.5MB。 –

回答

1

你要跟踪每个发电机产生或没有办法知道是否一些新的号码已经见过许多。什么是最好的方式来做到这一点?这取决于您要检查的号码数量。对于小N,使用HashSet。在大量的N中,使用位图变得更高效。

对于小的N ...

public class Accumulator { 
    private int uniqueNumbers = 0; 
    private int totalAccumulated = 0; 
    private HashSet<int> set = new HashSet<int>(); 

    public void Add(int i) { 
    if (!set.Contains(i)) { 
     set.Add(i); 
     uniqueNumbers++; 
    } 

    totalAccumulated++; 

    } 

    public double PercentUnique() { 
    return 100.0 * uniqueNumbers/totalAccumulated; 
    } 
}