如何在C#中复制PHP的PRNG算法实现?

时间:2015-11-01 12:49:26

标签: c# php random

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

我可以使用mt_srand($id);设置种子并始终使用相同的数字序列(使用mt_rand(0,255);)。

我需要什么:

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

示例:

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

(^函数名称不是指现有名称,仅举例说明)

1 个答案:

答案 0 :(得分:1)

感谢您的提示!

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

因为我很快就需要它并且没有时间通过​​整个Mersenne Twister理论和两种语言的不兼容性(比如类型和操作符的不同行为......)我决定写一个非常简单的PRNG算法:< / p>

<强> 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::seed($seed);
CiaccoRandom::getRand($min,$max); // returns a pseudo-random int

备注:

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

它非常有限,但它的目的很有用!

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