Algorithm 数不胜数
假设我有一个32位整数。起初,我在这个黑盒子里植入了一些随机/秘密的东西 每次我呼叫advance,我都会得到序列中的下一个号码,但序列中的下一个号码不一定是下一个最大的号码,就像Algorithm 数不胜数,algorithm,random,permutation,Algorithm,Random,Permutation,假设我有一个32位整数。起初,我在这个黑盒子里植入了一些随机/秘密的东西 每次我呼叫advance,我都会得到序列中的下一个号码,但序列中的下一个号码不一定是下一个最大的号码,就像++一样,这是不可预测的。我用一个置换表来做这件事,但这需要很大的空间,我想知道是否有人知道一个特定的构造,它会给我一个基于某个种子值的确定顺序的整个范围,然后每个循环只产生一次精确的值 有人知道这样一个方案吗?托马斯·波宁(Thomas Pornin)提出了一个有趣的问题,这个问题涉及到如何设计安全(ASG) 这不是
++
一样,这是不可预测的。我用一个置换表来做这件事,但这需要很大的空间,我想知道是否有人知道一个特定的构造,它会给我一个基于某个种子值的确定顺序的整个范围,然后每个循环只产生一次精确的值
有人知道这样一个方案吗?托马斯·波宁(Thomas Pornin)提出了一个有趣的问题,这个问题涉及到如何设计安全(ASG) 这不是解决我问题的最快方法,但我想它会的 我写这段代码是为了测试我的理论
struct Lfsr
{
public readonly int State;
public Lfsr(int seed)
{
this.State = seed;
}
public Lfsr Advance()
{
var bit = ((State >> 30) ^ (State >> 27)) & 1; // ^ (State >> 1) ^ (State >> 0)
return new Lfsr(((State << 1) | bit) & 0x7fffffff);
}
}
static void Main(string[] args)
{
var n = 0;
var lfsr = new Lfsr(1);
do
{
lfsr = lfsr.Advance();
++n;
}
while (lfsr.State != 1);
Console.WriteLine(n);
}
struct Lfsr
{
公共只读int状态;
公共Lfsr(国际种子)
{
这个国家=种子;
}
公共财政预支
{
变量位=((状态>>30)^(状态>>27))&1;/^(状态>>1)^(状态>>0)
返回新的Lfsr(((这样说?你要求的是随机生成,但顺序是基于种子值的?你能澄清一下吗?我很困惑。@Daniel我想线性反馈移位寄存器是我要找的。随机部分有误导性,我会清理其中的一些。你需要序列不可预测,以至于无法确定吗使用生成器的输出生成种子?因为如果是这样,则需要使用。@Zim-ZamO'Pootertoot它本身不需要安全,但在我看来越难预测越好。我的诀窍是以某种不可预测的方式在一个范围内精确循环每个值一次。