如何复制PHP';s-PRNG算法在C#中的实现?
我创建了一个程序图像生成器,它使用PHP5中内置的默认伪随机数生成器 我可以用如何复制PHP';s-PRNG算法在C#中的实现?,c#,php,random,C#,Php,Random,我创建了一个程序图像生成器,它使用PHP5中内置的默认伪随机数生成器 我可以用mt_srand($id)设置种子并始终获得相同的数字序列(使用mt_rand(0255);) 我需要的是: 在PHP和C中工作方式完全相同的PRNG实现# 示例: PHP: mt_srand(123); 埃科穆兰(0255)//返回34 埃科穆兰(0255)//返回102 埃科穆兰(0255)//返回57 埃科穆兰(0255)//返回212 埃科穆兰(0255)//返回183 C#: setSeed(123);
mt_srand($id)设置种子编码>并始终获得相同的数字序列(使用mt_rand(0255);
)
我需要的是:
在PHP和C中工作方式完全相同的PRNG实现#
示例:
PHP:
mt_srand(123);
埃科穆兰(0255)//返回34
埃科穆兰(0255)//返回102
埃科穆兰(0255)//返回57
埃科穆兰(0255)//返回212
埃科穆兰(0255)//返回183
C#:
setSeed(123);
打印getRand(0255)//返回34
打印getRand(0255)//返回102
打印getRand(0255)//返回57
打印getRand(0255)//返回212
打印getRand(0255)//返回183
(^函数名不是指现有的函数名,只是为了举例而命名)谢谢您的提示
我解决了自己在C#和PHP中实现自定义PRNG算法的问题
由于我很快就需要它,而且没有时间研究整个Mersenne Twister理论和两种语言的不兼容性(例如类型和运算符的不同行为…),我决定编写一个非常简单的PRNG算法:
C#
代码:
使用系统;
公开课
{
私有静态int树=0;
公共无效植物种子(int种子)
{
tree=Math.Abs(seed)%999999+1;
格特兰(09999999);
}
公共整数getRand(整数最小值,整数最大值)
{
树=(树*125)%2796203;
返回树%(最大最小值+1)+最小值;
}
}
用法:
int-seed=123;
int min=0;
int max=255;
CiaccoRandom randomer=新的CiaccoRandom();
植物种子(种子);
randomer.getRand(最小值,最大值);//返回一个伪随机整数
PHP
代码:
namespace-ciacco\u-twister;
随机类{
私有静态$tree=0;
公共静态函数plantSeed($seed){
self::$tree=abs(intval($seed))%999999+1;
self::getRand();
}
公共静态函数getRand($min=0,$max=999999){
self::$tree=(self:$tree*125)%2796203;
返回自我::$tree%($max-$min+1)+$min;
}
}
用法:
require_once“ciacco_twister.php”;
使用ciacco_捻线器\CiaccoRandom;
$seed=123;
$min=0;
$max=255;
CiaccoRandom::植物种子($seed);
CiaccoRandom::getRand($min,$max);//返回一个伪随机整数
注意事项:
我需要一个PRNG,给定一个种子和一个整数范围,它在PHP和C#中总是返回相同的整数序列
这是相当有限的,但它服务于它的目的
也许它对其他人有用…任何给定的平台或API都可以自由地实现自己的PRNG,当然,数字的确切顺序将取决于具体的实现选择。我不知道是否有一个标准的PHP实现。当然,.NET的实现(在您的C#代码中使用)不能保证在不同版本的.NET中是相同的。要可靠地保证不同的进程使用相同的PRNG,唯一的方法是在代码中包含您自己的实现。如果你想得到帮助,做一些研究,尝试一下,如果遇到问题,可以问一个具体的问题。一定要包括显示您尝试过的内容,以及对代码功能的精确解释,以及它与您希望它执行的功能的不同之处。@PeterDuniho themt
代表Mersenne Twister。Ciacco,您是否尝试过使用复制值?小提示:PHP似乎使用了与Dave Wagner的实现兼容的实现,例如@MaartenBodewes是的,我尝试过!但正如您所指出的,有不同的实现将返回不同的结果。谢谢你的帮助,我会努力实现的!