C++ 使用qt的随机因变量
我遇到了一个设计问题。做好准备,因为还有很多事情要做,也许这是一个太复杂的问题 对于熟悉R的人,这可能会有所帮助: 我在R中创建了一个包,用于创建变量之间的相关性(用于模拟)。我创建了一个多线程版本以允许并行性。虽然R使它显得很尴尬,但我几乎重新考虑C++中的这个语句。C++ 使用qt的随机因变量,c++,r,qt,parallel-processing,statistics,C++,R,Qt,Parallel Processing,Statistics,我遇到了一个设计问题。做好准备,因为还有很多事情要做,也许这是一个太复杂的问题 对于熟悉R的人,这可能会有所帮助: 我在R中创建了一个包,用于创建变量之间的相关性(用于模拟)。我创建了一个多线程版本以允许并行性。虽然R使它显得很尴尬,但我几乎重新考虑C++中的这个语句。 对100000×2的随机数据矩阵进行采样 将其拆分为(100000/200)=500个200行2列数据矩阵的拆分列表 使用一个多核列表应用函数(mclappy,它可以将矩阵作为列表中的“项”进行处理),我能够将这些具有两个维度
- 对100000×2的随机数据矩阵进行采样
- 将其拆分为(100000/200)=500个200行2列数据矩阵的拆分列表
- 使用一个多核列表应用函数(
,它可以将矩阵作为列表中的“项”进行处理),我能够将这些具有两个维度的较小数据矩阵发送到同一个函数,尽管在不同的线程中mclappy
- 函数在第二列上有条件地随机重新排列第一列,以产生某种相关性。然后返回重新排列的矩阵。我不是在要求这一部分,我只是提到这一点,以排除那些通过独立创建
和x
跳过步骤的解决方案y
- list apply函数会自动将200行2列的500个拆分部分粘在一起,形成一个大矩阵(100000 x 2)
mclapply(listdata, myFunction, cores=4)
结果:
[1] [2]
... ...
... ...
... ...
... ...
随机性
我想要一个线程安全、统计随机(与伪随机性无关的结果)函数,生成聚合的依赖x
和y
向量
- 随机性是困难的,因为随机生成器通常有一个全局状态,这在并行情况下是不可能共享的
QList< QVector<double> > list_of_one_split;
QList< QList< QVector<double> > list_containing_all_splits;
QVector<double> vector_of_doubles(10);
qFill(vector_of_doubles.begin(), vector_of_doubles.end(), 1); // not random
list_of_a_split.append(vector_of_doubles); // x variable split
list_of_a_split.append(vector_of_doubles); // y variable split
list_containing_all_splits.append(list_of_a_split) // first split
list_containing_all_splits.append(list_of_a_split) // second split
QtFuture<void> res = `QtConcurrent::map(list_containing_all_splits.begin(),
list_containing_all_splits.end(),
mapFunction)`
QList< QVector<double> > mapFunction(QList< QVector<double> > &list_of_a_split)
{
// random arranging one column on other
return list_of_a_split;
}
“随机性是困难的,因为随机生成器通常有一个全局状态,在并行情况下不可能共享。”-我不确定情况是否如此,你能不能不使用QMutex?@JamesElderfield谢谢你的回答。两件事。1) 我不知道如何将QMutex放入qtube中。2) 每个拆分中的重新排列需要随机数,当QMutex锁定该情况时,它基本上变成串行而不是并行以获得随机索引。1)本页()有一个在“实用提示”下使用QMutex和QtConcurrent的示例。2) 我明白你的意思了,让它变成串行的,那么在开始时生成一个随机的数字列表,然后使用这个列表为每个线程的独立RNG设置种子呢?我相信这仍然会给你统计上的随机输出(但我不确定)。@JamesElderfield我尝试过使用列表平方的第一个元素作为srand(pow(list[0][0],2)),但这不起作用。另外,当只能向映射器发送一种类型,然后再接收相同的格式时,如何将此列表发送到函数?我不完全确定第一部分的意思,但要将列表发送到函数,我将编写一个包装器类。这个类将包含RNG状态的变量(最初来自随机数列表)、拆分列表以及您可能需要的任何其他变量。然后您可以在这个类上调用mapFunction。
QList< QVector<double> > list_of_one_split;
QList< QList< QVector<double> > list_containing_all_splits;
QVector<double> vector_of_doubles(10);
qFill(vector_of_doubles.begin(), vector_of_doubles.end(), 1); // not random
list_of_a_split.append(vector_of_doubles); // x variable split
list_of_a_split.append(vector_of_doubles); // y variable split
list_containing_all_splits.append(list_of_a_split) // first split
list_containing_all_splits.append(list_of_a_split) // second split
QtFuture<void> res = `QtConcurrent::map(list_containing_all_splits.begin(),
list_containing_all_splits.end(),
mapFunction)`
QList< QVector<double> > mapFunction(QList< QVector<double> > &list_of_a_split)
{
// random arranging one column on other
return list_of_a_split;
}
// Whether or not packed in a QList< >:
QVector<double> x = {..., ..., ..., ...};
QVector<double> y = {..., ..., ..., ...}; // dependent on x