我正在尝试连续生成一系列随机线性无关的二进制向量,每个包含1024个元素0或1.我需要生成1024(这也是我能得到的最大值)这样的向量。这是我做的基本想法
srand( (unsigned) time(NULL) );
while(obtained <= 1024)
{
for (int i=0;i<1024;i++)
vector[i] = rand() % 2;
check linear indepence against previously stored linearly independent vectors
if (linearly independent)
store it;
obtained += 1;
else
discard;
}
然而,似乎代码在这里只能生成527个线性独立向量,这很奇怪。我发现它可能是随机数生成器的问题,因为如果我将srand()放在循环中,即在每次执行rand()之前,它就能够完成生成1024个这样的向量。但是,该计划将非常缓慢。
另外,有趣的是,如果我想生成1024个1024维随机线性独立向量,这些向量由从Galois域GF(4)或更高的选择而不是二进制字段组成,则上述代码段工作正常。 / p>
请注意,此处的线性独立性取决于有限域中的操作。
有人可以帮助解释可能的原因并提出一些指示吗?真诚的谢谢。
答案 0 :(得分:2)
您似乎正在使用具有rand
低质量实现的C库。例如,在MSVC的CRT中实现是非常糟糕的。
您所做的实际上与测量随机数生成器质量的常见统计测试非常相似。矩阵的等级测试创建随机二进制矩阵,计算它们的等级,并测试等级的分布是否与预期分布匹配。从本质上讲,您的代码无法创建完整的二进制矩阵。
您可以使用更好的RNG(可能来自第三方库)或尝试以下方法之一:
rand
返回的值的其他位。rand
并丢弃该值。由于1024是2的幂,这可能是随机值中某种重复的原因。rand
的单个调用中的更多位。确保检查系统上RAND_MAX的值。答案 1 :(得分:0)
我很高兴地说我已经通过在GNU科学图书馆(GSL)中使用RNG解决了这个问题。现在使用gsl_rng_mt19937
RNG代替unix标准rand()。