我创建了一个程序图像生成器,它使用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
(^函数名称不是指现有名称,仅举例说明)
答案 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数字序列。
它非常有限,但它的目的很有用!
也许它对其他人也有用......