2013-04-17 40 views
1

我一直在尋找在線爲一個簡單的在線的OpenCL數發生器。我找不到任何易於使用的東西。簡單的OpenCL隨機生成

我想要的東西,像下面這樣:

int generateRandomNumber(int fromNumber, int toNumber) 
{ 
    int num = functionOfRandomness(); 
    return num; 
} 

如果有誰知道我怎樣才能得到兩個數值將是非常讚賞之間的隨機數的例子。它不必是一個複雜的隨機系統只是一些,將工作簡單而快速

感謝

+1

答案在http://stackoverflow.com/questions/9912143/how-to-get-a-random-number-in-opencl不是你不夠好? – JayC

+0

我想要一些已經實現的東西。 Park-Miller描述的是僞 – bubblebath

+0

所有生成隨機數序列的算法都是僞隨機的。生成密碼強的隨機數序列的任何*方法*通常需要已經「隨機」來源的輸入。 – JayC

回答

-3

C語言中的標準rand()函數會產生隨機浮點數。

你只需從自己的函數中調用這個和內部RAND_MAX可變調節輸出。以下示例應該在所需範圍內生成一個隨機浮點數。如果這是你所需要的,你可以很容易地把結果作爲int

#include<stdlib.h> 

float myrand(float setmin, float setmax) 
{ 

    float range = setmax - setmin ; 

    if(RAND_MAX>=range) 
     return (setmin + rand()/(RAND_MAX/range)) 

    else 
     return (setmin + rand()/(range/RAND_MAX)) 

} 
+0

警告:函數「蘭特」的隱含的聲明是無效的C99 – bubblebath

+0

不能在OpenCL的方法中使用標準C庫函數。不過,上面的代碼可能會用於其他原因。 – JayC

+0

如果不是蘭特()不是一個選項,喬治馬爾薩利亞的算法之一(例如,[乘法與進位](http://en.wikipedia.org/wiki/Multiply-with-carry))應該足夠,並且上面的簡單算法會使您在所需的範圍內輸出。當然,您需要確定「RAND_MAX」將用於您使用的任何方法。 – JWDN

3

我在geeks3d撕開這下面的代碼從實時的OpenCL路徑示蹤。內核以純文本格式顯示。我首先學會了如何使用OpenCL。

http://www.geeks3d.com/20120502/laguna-real-time-opencl-path-tracer/

float4 rand(uint2 *state) 
{ 
    const float4 invMaxInt = (float4) (1.0f/4294967296.0f, 1.0f/4294967296.0f, 1.0f/4294967296.0f, 0); 
    uint x = (*state).x * 17 + (*state).y * 13123; 
    (*state).x = (x<<13)^x; 
    (*state).y ^= (x<<7); 

    uint4 tmp = (uint4) 
    ((x * (x * x * 15731 + 74323) + 871483), 
     (x * (x * x * 13734 + 37828) + 234234), 
     (x * (x * x * 11687 + 26461) + 137589), 0); 

    return convert_float4(tmp) * invMaxInt; 
}