如何复制PHP';s PRNG算法在C#中的实现

本文关键字:算法 PRNG 实现 何复制 复制 PHP | 更新日期: 2023-09-27 18:20:10

我创建了一个过程图像生成器,它使用PHP5中内置的默认伪随机数生成器。

我可以用mt_srand($id);设置种子,并且总是得到相同的数字序列(用mt_rand(0,255);)。


我需要什么:

在PHP和C#中以完全相同的方式工作的PRNG实现


示例:

PHP:

mt_srand(123);
echo mt_rand(0,255); //returns 34
echo mt_rand(0,255); //returns 102
echo mt_rand(0,255); //returns 57
echo mt_rand(0,255); //returns 212
echo mt_rand(0,255); //returns 183

C#:

setSeed(123);
print getRand(0,255); //returns 34
print getRand(0,255); //returns 102
print getRand(0,255); //returns 57
print getRand(0,255); //returns 212
print getRand(0,255); //returns 183

(^函数名不是指现有的函数名,只是为了举例而命名)

如何复制PHP';s PRNG算法在C#中的实现

感谢您的提示!

我自己用C#和PHP解决了实现自定义PRNG算法的问题。

由于我很快就需要它,而且没有时间研究整个Mersenne Twister理论和两种语言的不兼容性(比如类型和运算符的不同行为…),我决定写一个非常简单的PRNG算法:

C#

代码:

using System;
public class CiaccoRandom
{
    private static int tree=0;
    public void plantSeed(int seed)
    {
        tree = Math.Abs(seed) % 9999999+1;
        getRand(0, 9999999);
    }
    public int getRand(int min, int max)
    {
        tree = (tree*125)%2796203;
        return tree%(max-min+1)+min;
    }
}

用法:

int seed = 123;
int min = 0;
int max = 255;
CiaccoRandom randomer = new CiaccoRandom();
randomer.plantSeed(seed);
randomer.getRand(min, max); // returns a pseudo-random int

PHP

代码:

namespace ciacco_twister;
class CiaccoRandom {
    private static $tree = 0;
    public static function plantSeed($seed) {
        self::$tree = abs(intval($seed)) % 9999999+1;
        self::getRand();
    }
    public static function getRand($min = 0, $max = 9999999) {
        self::$tree = (self::$tree * 125) % 2796203;
        return self::$tree % ($max - $min + 1) + $min;
    }
}

用法:

require_once "ciacco_twister.php";
use ciacco_twister'CiaccoRandom;
$seed = 123;
$min = 0;
$max = 255;
CiaccoRandom::plantSeed($seed);
CiaccoRandom::getRand($min,$max); // returns a pseudo-random int

注意:

我需要一个PRNG,给定一个种子和一个int范围,它在PHP和C#中总是返回相同的int数字序列。

它非常有限,但它达到了目的!

也许它对其他人有用。。。