标签: prng

这个GLSL兰德()单线的起源是什么?

我已经看到这个伪随机数生成器用于在这里和那里引用的着色器:

float rand(vec2 co){
  return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}
Run Code Online (Sandbox Code Playgroud)

它被称为"规范",或"我在网上找到的单行".

这个功能的起源是什么?恒定值是否像它们看起来一样任意或是否有一些艺术选择?有没有讨论这个功能的优点?

编辑:我遇到的这个函数最早的参考是从20082月开始的这个档案,原来的页面现在已经从网上消失了.但是那里没有比其他任何地方更多的讨论.

shader glsl prng

88
推荐指数
3
解决办法
3万
查看次数

随机和随机的差异

我试图找出/dev/random/dev/urandom文件之间的差异

  1. /dev/random和之间有什么区别/dev/urandom
  2. 我应该什么时候使用它们?
  3. 什么时候不应该使用它们?

random prng

48
推荐指数
4
解决办法
2万
查看次数

带有NativePRNG和SHA1PRNG的SecureRandom

我需要生成加密强大的随机数和字节数组.为此,我正在使用Java的SecureRandom类.但我不确定在加密强度方面选择哪种PRNG算法.

以下哪个实例会产生更难以预测的数字?或者他们是平等的?

SecureRandom nativePrng = SecureRandom.getInstance("NativePRNG")
SecureRandom sha1Prng = SecureRandom.getInstance("SHA1PRNG")
Run Code Online (Sandbox Code Playgroud)

此外,我们能够使用"SUN"提供程序(例如SecureRandom.getInstance("SHA1PRNG", "SUN"))生成这些实例.这会有所作为吗?

提前致谢.

java random cryptography prng

35
推荐指数
2
解决办法
3万
查看次数

范围内的随机数,概率相等

这可能比C#更加数学相关,但我需要一个C#解决方案,所以我把它放在这里.

我的问题是关于随机数生成器的概率,更具体地说,如果以相等的概率返回每个可能的值.

我知道有Random.Next(int,int)方法,它返回第一个整数和最后一个之间的数字(最后一个是独占的).

Random.Next() [without overloads]将返回介于0和Int32.MaxValue(即2147483647)之间的值 - 1,所以2147483646.

如果我想要一个介于1和10之间的值,我可以打电话Random.Next(1, 11)来做这个,但是1到10之间的每个值都有相同的发生概率吗?

例如,范围是10,因此2147483646不能完全被10整除,因此值1-6具有稍高的发生概率(因为2147483646 % 10 = 6).这当然假设Random.Next()[无重载] 内的每个值以相等的概率返回介于0和2147483646之间的值.

如何确保范围内的每个数字具有相同的发生概率?让我们说一个彩票类型系统,对某些人来说比其他人有更高的可行性是不公平的,我不是说我会使用内置RNG的C#,我只是以它为例.

c# random range prng

26
推荐指数
3
解决办法
1万
查看次数

真随机数发生器

对不起,这不是一个"真实"的问题,但有时回来我记得在这里看到一篇关于随机随机化随机化生成真正随机数的帖子,而不仅仅是伪随机数.如果我搜索它,我不会看到它.

有人知道那篇文章吗?

language-agnostic random algorithm prng

25
推荐指数
5
解决办法
2万
查看次数

可逆伪随机序列发生器

我想要某种方法来创建一个相当长的随机数序列,我可以向前和向后翻转.就像具有"下一个"和"上一个"按钮的机器一样,它会为您提供随机数字.

像10位分辨率(即0到1023范围内的正整数)就足够了,并且序列> 100k.这是一个简单的游戏类型的应用程序,我不需要加密强度随机性或任何东西,但我希望它感觉相当随机.我有可用的内存有限,所以我不能只生成一大块随机数据并通过它.我需要在"交互时间"中获取数字 - 我可以轻松地花几个小时思考下一个数字,但不是比这更舒服.最终它将在某种微控制器上运行,可能只是一个Arduino.

我可以用简单的线性同余生成器(LCG)来做到这一点.前进很简单,向后退我必须缓存最近的数字并间隔存储一些点,这样我就可以从那里重新创建序列.

但也许有一些伪随机发生器可以让你前进和前进?应该可以连接两个线性反馈移位寄存器(LFSR)以在不同方向上滚动,不是吗?

或者也许我可以使用某种哈希函数来填充索引号?我要先尝试一下.

还有其他想法吗?

random reverse arduino prng

21
推荐指数
3
解决办法
9144
查看次数

分布和内部状态

在Stackoverflow上,有很多关于从a-priory未知范围生成均匀分布的整数的问题.例如

典型的解决方案是这样的:

inline std::mt19937 &engine()
{
  thread_local std::mt19937 eng;
  return eng;
}

int get_int_from_range(int from, int to)
{
  std::uniform_int_distribution<int> dist(from, to);
  return dist(engine());
}
Run Code Online (Sandbox Code Playgroud)

鉴于分布应该是一个轻量级对象并且没有性能问题需要多次重新创建它,看起来即使是简单的分发也可能很好并且通常会有一些内部状态.

所以我想知道是否通过不断重置它来干扰分布如何工作(即在每次调用时重新创建分布get_int_from_range)我得到了正确分布的结果.

Pete Becker和Steve Jessop之间进行了长时间的讨论,但没有最后的说法.在另一个问题中(我应该保留随机分布对象实例还是可以随时重新创建它?)内部状态的"问题​​"似乎并不重要.

C++标准是否对此主题做出了任何保证?

以下实现(来自N4316 - std :: rand替换)是否更可靠?

int get_int_from_range(int from, int to)
{
  using distribution_type = std::uniform_int_distribution<int>;
  using param_type = typename distribution_type::param_type;

  thread_local std::uniform_int_distribution<int> dist;
  return dist(engine(), param_type(from, to));    
}
Run Code Online (Sandbox Code Playgroud)

编辑

这重用了分发的可能的内部状态,但它很复杂,我不确定它是否值得麻烦:

int get_int_from_range(int from, int to)
{
  using …
Run Code Online (Sandbox Code Playgroud)

c++ random distribution prng c++11

18
推荐指数
1
解决办法
633
查看次数

是否存在无状态随机数生成器?

使用单个随机数发生器(RNG)生成多个数字与每个发生器生成一个数字并丢弃它之间有区别吗?这两种实现都会产生同等随机的数字吗?普通RNG和安全RNG之间是否存在差异?

我有一个Web应用程序,应该代表客户生成一个随机数列表.也就是说,从每个客户的角度来看,数字应该是随机的.这是否意味着我需要为每个客户会话保留一个单独的随机RNG?或者我可以在所有会话中共享一个RNG吗?或者我可以根据请求创建和丢弃RNG吗?

更新:这个问题与随机序列的子集是否也是随机的有关?

random stateless prng

16
推荐指数
4
解决办法
5748
查看次数

为线性同余发生器挑选A,C和M.

我希望实现一个具有指定周期的简单伪随机数发生器(PRNG),并确保在该周期的持续时间内没有冲突.经过一番研究后,我发现了非常着名的LCG,这是完美的.问题是,我无法理解如何正确配置它.这是我目前的实施:

    function LCG (state)
    {
        var a = ?;
        var c = ?;
        var m = ?;

        return (a * state + c) % m;
    }
Run Code Online (Sandbox Code Playgroud)

它表示,为了使所有种子值都有一个完整的时间段,必须满足以下条件:

  1. cm是相对素数
  2. a-1可被m的所有素因子整除
  3. 如果m是4的倍数,则a-1是4 的倍数

13很容易理解和测试.然而,2,我不太明白这意味着什么或如何检查它.那么C,它可以为零吗?如果它不是零怎么办?

总的来说,我需要选择A,C和M,使得我的周期为48 ^ 5 - 1.M等于期间,我不确定A和C.

javascript algorithm math prng number-theory

16
推荐指数
1
解决办法
4690
查看次数

仅使用Java中的/ dev/random

我有一个HRNG在Debian Wheezy中提供/ dev/random.它很快,因此阻塞不会成为问题.现在,在我的Java代码中,我想确保我在/ dev/random中使用熵,并且只使用熵.我没兴趣使用/ dev/urandom中的任何东西.

我想强制Java的SecureRandom只从/ dev/random获取熵.据我了解目前的实现,它在调用getBytes()时使用/ dev/urandom,而在调用generateSeed()时使用/ dev/random.我不知道为什么.

据我所知,从/ dev/urandom读取的唯一原因是你喜欢速度超过安全性.我想要最高质量的熵./ dev/urandom就是不行.

那么,我如何强制SecureRandom只使用/ dev/random(由HRNG提供)并且从不接触来自劣质PRNG(如/ dev/urandom)的任何内容?

谢谢你.

java random entropy prng

16
推荐指数
1
解决办法
2358
查看次数