2017-05-30 69 views
0

我想在Visual Studio中使用OpenGL和C++创建类似地形的森林。当然,我想随意放置树木或灌木丛等物体,这样看起来更自然。我想通过使用rand()函数来做到这一点,但通过使用它,程序运行时,我的对象不断变化的位置。我知道程序在循环中,因为rand()是按照它的方式行事的。我想问你们是否有一个很好的替代方案。我只想为每个对象创建一个随机位置值,并且该值保持不变。这里有一小部分代码有这个问题:OpenGL C++如何获得随机值?

for (int i = -5.0; i < 5.0; i++){ 
    for (int j = -5.0; j < 5.0; j++){ 
     double k = i * 10.0 + ((rand() % 20 + 10) + ((rand() % 8 + 1)/10.)); 
     double l = j * 10.0 + ((rand() % 20 + 10) + ((rand() % 8 + 1)/10.)); 
     if (i % 2 == 0 && j % 2 == 0) 
     { 
      drvo(k, l); 
     } 
    } 
} 

我得到的任何帮助将非常感谢!

+2

调用rand()来获取您的随机位置,然后将该位置值存储在某个地方以供将来重新使用(而不是每次为每个帧再次调用每个对象的rand())。这样,你的物体将被随机放置,但留在同一个地方。 –

+1

尝试使用std :: uniform_real_distribution 从C++ 11 像这里https://stackoverflow.com/questions/19665818/generate-random-numbers-using-c11-random-library –

+0

@JeremyFriesner,我不我想我很了解你。我在渲染场景的函数之外添加了一些行: ' int c = rand()%20; int a = c; int d = rand()%10; INT B = d;' 而改变了代码一点点: ' 对(INT I = -5.0; I <5.0;我++){ \t \t对(INT J = -5.0;Ĵ<5.0; (k + 1)/ 10;其中k = 1 * 10 + a + 10 +(b + 1)/ 10。 (a + 1)/ 10;其中, \t \t \t如果(ⅰ%2 == 0 &&Ĵ%2 == 0) \t \t \t { \t \t \t \t DRVO(K,L); \t \t \t} \t \t} \t}' 这种方法行不通,因为它总是加载相同的值。我相信我在某个时候误解了你。 – Daelendil

回答

1

rand不是完全随机的,它是伪随机的。意思是给定相同的种子,rand将产生相同的值。

我建议使用srand来种子PRNG种子,您保存以备将来使用。

当您想再次渲染场景时,请使用保存的种子再次调用srand,调用rand的顺序应该会产生相同的结果。

+0

纠正我,如果我错了。但据我了解,每台计算机生成的数字都是伪随机数。因为每个随机数生成算法都是预定义的,并且可以处理已知输入。 – cse

+0

没有电脑可以产生真正的随机数。计算机是确定性的,任何生成随机数的算法都会产生循环的数字序列(区分好坏发生器的是那些循环的长度)。真正的随机性来源并不常见或易于使用(放射性物质是一个很好的来源)。 –

+0

而我的回答并不矛盾。在编程环境中,如果您依赖随机性(例如:赌博,密码学),则需要仔细选择熵源。有商用设备可以让您生成熵作为RNG的输入。 – arboreal84