C 随机线性无关二元向量的生成问题
我试图连续生成一个随机线性独立的二进制向量序列,每个向量包含1024个元素0或1。我需要生成1024个(这也是我能得到的最大值)这样的向量。这是我所做的基本想法C 随机线性无关二元向量的生成问题,c,random,vector,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 previous
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;
}
srand((无符号)时间(NULL));
虽然(获得似乎您使用的C库的rand
实现质量很低。例如,MSVC的CRT中的实现是出了名的糟糕
实际上,您所做的与测量随机数生成器质量的常用统计测试非常相似。矩阵秩测试创建随机二进制矩阵,计算其秩,并测试秩的分布是否与预期分布匹配。本质上,您的代码无法创建满秩二进制矩阵特里克斯
您可以使用更好的RNG(可能来自第三方库),也可以尝试以下方法:
- 使用
rand
返回的值的不同位
- 经过一定次数的迭代后,再次调用
rand
,并丢弃该值。由于1024是2的幂,这可能是随机值中出现某种重复的原因
- 从单个调用
rand
中使用更多位。确保在系统上检查rand_MAX的值
我很高兴地说,通过在GNU科学库(GSL)中使用RNG,我已经解决了这个问题。现在使用GSL\u RNG\u mt19937
RNG代替unix标准rand()。实际上我是在Linux环境中工作的,所以使用标准C库。