【问题标题】:Simple OpenCL random generator简单的 OpenCL 随机发生器
【发布时间】:2013-04-10 11:37:02
【问题描述】:

我一直在网上寻找一个简单的在线 OpenCL 数字生成器。我找不到任何易于使用的东西。

我想要类似下面的东西:

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

如果有人知道我如何获得两个值之间的随机数的示例,将不胜感激。它不必是一个复杂的随机系统,只需简单快速地工作即可

谢谢

【问题讨论】:

标签: c opencl


【解决方案1】:

我从 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;
}

【讨论】:

    【解决方案2】:

    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) ) 
    
    }
    

    【讨论】:

    • 警告:函数 'rand' 的隐式声明在 C99 中无效
    • 您不能在 OpenCl 方法中使用标准 C 库函数。不过,出于其他原因,上面的代码可能很有用。
    • 如果没有 rand() 不是一个选项,George Marsaglia 的算法之一(例如multiply-with-carry)就足够了,上面的简单算法将为您提供所需范围内的输出。当然,无论您使用哪种方法,您都需要确定“RAND_MAX”是什么。
    猜你喜欢
    • 2013-11-07
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    相关资源
    最近更新 更多