Random 尝试写入8位的可逆PRNG,而不是密码
我正在尝试构建一个字节的PRNG,在这里我可以获取一组字节(比如说,10或15个字节),并返回一个种子列表,从而生成该字节列表。我不关心密码学,但它必须是大致均匀分布的,它必须命中所有可能的2^8组合,并且它必须偶尔能够重复一个数字而不会卡住 问题是,我读过的大多数算法要么使用密码,这可能意味着它不允许重复,要么使用模数或非循环移位,这会导致损失,使函数的反转充其量也不切实际。此外,如果算法使用计数,则很难向后工作,因为字节列表输入在生成时不知道内部PRNG计数器是什么 我意识到我要找的是一个“吃你的蛋糕,也吃你的蛋糕”的情况,但我想确保我没有错过另一个解决方案 在搜索时,我遇到了有类似要求的。我是用C语言写的,但实际上,语法并不重要 我自己尝试编写的每一个算法都是一个密码,因此无法重复和/或分布不均匀。我使用了反转、循环移位和种子掩蔽。这有用吗Random 尝试写入8位的可逆PRNG,而不是密码,random,prng,Random,Prng,我正在尝试构建一个字节的PRNG,在这里我可以获取一组字节(比如说,10或15个字节),并返回一个种子列表,从而生成该字节列表。我不关心密码学,但它必须是大致均匀分布的,它必须命中所有可能的2^8组合,并且它必须偶尔能够重复一个数字而不会卡住 问题是,我读过的大多数算法要么使用密码,这可能意味着它不允许重复,要么使用模数或非循环移位,这会导致损失,使函数的反转充其量也不切实际。此外,如果算法使用计数,则很难向后工作,因为字节列表输入在生成时不知道内部PRNG计数器是什么 我意识到我要找的是一个“
#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许可代码。你引用的帖子似乎回答了你的问题。该线程中的答案使用密码,除非我遗漏了什么,否则不允许重复输出而不会卡住。你引用的帖子似乎回答了你的问题。该线程中的答案使用密码,除非我遗漏了什么,不允许重复输出而不卡住。我看到的主要问题是,移位只使用部分种子会导致损失,留下数百万种可能的组合。除非我遗漏了什么,否则从种子到字节的转换是不可逆的,但除此之外,我喜欢它。我看到的主要问题是,这种转换只使用部分种子就会导致损失,留下数百万种可能的组合。除非我遗漏了什么,否则从种子到字节的转换是不可逆的,但除此之外,我喜欢它。