Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Random 尝试写入8位的可逆PRNG,而不是密码_Random_Prng - Fatal编程技术网

Random 尝试写入8位的可逆PRNG,而不是密码

Random 尝试写入8位的可逆PRNG,而不是密码,random,prng,Random,Prng,我正在尝试构建一个字节的PRNG,在这里我可以获取一组字节(比如说,10或15个字节),并返回一个种子列表,从而生成该字节列表。我不关心密码学,但它必须是大致均匀分布的,它必须命中所有可能的2^8组合,并且它必须偶尔能够重复一个数字而不会卡住 问题是,我读过的大多数算法要么使用密码,这可能意味着它不允许重复,要么使用模数或非循环移位,这会导致损失,使函数的反转充其量也不切实际。此外,如果算法使用计数,则很难向后工作,因为字节列表输入在生成时不知道内部PRNG计数器是什么 我意识到我要找的是一个“

我正在尝试构建一个字节的PRNG,在这里我可以获取一组字节(比如说,10或15个字节),并返回一个种子列表,从而生成该字节列表。我不关心密码学,但它必须是大致均匀分布的,它必须命中所有可能的2^8组合,并且它必须偶尔能够重复一个数字而不会卡住

问题是,我读过的大多数算法要么使用密码,这可能意味着它不允许重复,要么使用模数或非循环移位,这会导致损失,使函数的反转充其量也不切实际。此外,如果算法使用计数,则很难向后工作,因为字节列表输入在生成时不知道内部PRNG计数器是什么

我意识到我要找的是一个“吃你的蛋糕,也吃你的蛋糕”的情况,但我想确保我没有错过另一个解决方案

在搜索时,我遇到了有类似要求的。我是用C语言写的,但实际上,语法并不重要

我自己尝试编写的每一个算法都是一个密码,因此无法重复和/或分布不均匀。我使用了反转、循环移位和种子掩蔽。这有用吗

#include <stdio.h>

int seed = 1;

int next() {
    seed = 1664525*seed + 1013904223;
    return (seed & 0xff) ^ (seed>>8 & 0xff) ^ (seed>>16 & 0xff) ^ (seed>>24 & 0xff);
}   

int main() {
    int i;
    for(i = 0; i < 1000; i++) {
        printf("%d\n", next());
    }   
}  
#包括
int种子=1;
int next(){
种子=1664525*种子+1013904223;
返回(seed&0xff)^(seed>>8&0xff)^(seed>>16&0xff)^(seed>>24&0xff);
}   
int main(){
int i;
对于(i=0;i<1000;i++){
printf(“%d\n”,next());
}   
}  
由于它是基于一个完整周期的线性同余生成器(LCG),因此每个字节最终都将由每个种子生成。似乎有重复。它继承了底层LCG的一致性。

这是否有效

#include <stdio.h>

int seed = 1;

int next() {
    seed = 1664525*seed + 1013904223;
    return (seed & 0xff) ^ (seed>>8 & 0xff) ^ (seed>>16 & 0xff) ^ (seed>>24 & 0xff);
}   

int main() {
    int i;
    for(i = 0; i < 1000; i++) {
        printf("%d\n", next());
    }   
}  
#包括
int种子=1;
int next(){
种子=1664525*种子+1013904223;
返回(seed&0xff)^(seed>>8&0xff)^(seed>>16&0xff)^(seed>>24&0xff);
}   
int main(){
int i;
对于(i=0;i<1000;i++){
printf(“%d\n”,next());
}   
}  

由于它是基于一个完整周期的线性同余生成器(LCG),因此每个字节最终都将由每个种子生成。似乎有重复。它继承了基础LCG的一致性。

我的顾问已将PRNG(基于L'Ecuyer的clcg4)修改为可逆,以支持我们集团的HPC模拟工作。你可以读到这些


基本上,它“撤销”已完成的操作,正如您可能猜到的,这可能需要“撤销”随机数生成,然后沿不同的计算路径再次重新生成相同的值。您可以查看此代码,然后单击。这是BSD许可代码。

我的顾问已将PRNG(基于L'Ecuyer的clcg4)修改为可逆,以支持我们集团的HPC模拟工作。你可以读到这些


基本上,它“撤销”已完成的操作,正如您可能猜到的,这可能需要“撤销”随机数生成,然后沿不同的计算路径再次重新生成相同的值。您可以查看此代码,然后单击。这是BSD许可代码。

你引用的帖子似乎回答了你的问题。该线程中的答案使用密码,除非我遗漏了什么,否则不允许重复输出而不会卡住。你引用的帖子似乎回答了你的问题。该线程中的答案使用密码,除非我遗漏了什么,不允许重复输出而不卡住。我看到的主要问题是,移位只使用部分种子会导致损失,留下数百万种可能的组合。除非我遗漏了什么,否则从种子到字节的转换是不可逆的,但除此之外,我喜欢它。我看到的主要问题是,这种转换只使用部分种子就会导致损失,留下数百万种可能的组合。除非我遗漏了什么,否则从种子到字节的转换是不可逆的,但除此之外,我喜欢它。