生成随机线性无关二元向量的问题

时间:2013-10-20 20:40:36

标签: c random vector

我正在尝试连续生成一系列随机线性无关的二进制向量,每个包含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>

请注意,此处的线性独立性取决于有限域中的操作。

有人可以帮助解释可能的原因并提出一些指示吗?真诚的谢谢。

2 个答案:

答案 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()。