c++ - rand() 在通过仿函数调用时生成相同的随机数集(即使在使用 srand(time(NULL)) 播种后)

标签 c++ random vector foreach thrust

我在生成随机数时遇到问题,我已经通读了关于 SO 的大多数帖子,但似乎没有一个解决方案有效。 请在将其标记为重复之前通读它

我有一个仿函数来生成 0.5 到 -0.5 之间的随机数:

struct randomize
{
    __host__  void operator()( double &x ) const {
        x=(double) (rand() % 1000000) / 1000000 - 0.5;
    }
};

我通过 for_each 调用它,如下所示:

thrust::for_each(myVector.begin(),myVector.end(),randomize());

它又在类的构造函数中被调用(假设是 myClass),它被称为:

myObjs=std::vector<myClass>(20,myClass(no_of_inputs));

问题是所有 myClass' 对象中的所有 myVector 都填充了同一组值。 这些值随每次运行而变化,但在所有 myVectors`

中都是相同的

我知道 rand() 是一个伪随机数生成器,它生成的数字不能指望是真正随机的。但是这太巧合了。

澄清一下:

  • 我在整个程序中只调用了一次 srand(time(NULL))
  • 我使用的是 thrust::for_each 而不是 std::for_each 但这应该不会有太大区别
  • 我知道随机仿函数远非完美,但我正在修改并除以 1000000 以获得小数点后的 6 位数字。如果您能指出更好的方法,那就太好了,但请不要被它冲昏头脑。
  • 我不能使用 c++11(目前)或 boost(根本)
  • 我不能为 myClass 使用默认构造函数
  • 我将不胜感激不需要我过多更改代码结构的解决方案

最佳答案

myObjs=std::vector<myClass>(20,myClass(no_of_inputs));

你为myClass定义了一个复制构造函数吗?随机化数据? (然而,在我看来,这违背了复制构造函数的目的)

如果不是,那么您正在复制相同的 myClass 20次入myObjvector<myClass>将通过调用每个元素的默认复制构造函数来构造,这反过来将简单地复制 myVector 中的数据。 .

关于c++ - rand() 在通过仿函数调用时生成相同的随机数集(即使在使用 srand(time(NULL)) 播种后),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20923551/

相关文章:

c++ - 段错误(核心转储)- 具有多维 vector 的循环 C++98

c++ - 使用一个函数对两个不同的 vector (每个 vector 都有 "active"bool)进行排序

c++ - Qt - 如何在线程中从串口读取数据

c++ - 使用点云库 (PCL) 时的 Boost 问题

c++ - 共享列表、多个条件、一个或多个条件变量?

c - 使用 OMP 中的线程生成相同的随机数

sql-server - 如何从数据库中选择随机行——有一点不同?

c++ - 使用 C++11 在一行中连接两个 std::vector

c++ - 如何避免相同的随机数序列

string - 如何将 Vec<String> 转换为 Vec<&str>?