C# 自定义随机数生成器

C# 自定义随机数生成器,c#,random,unity3d,C#,Random,Unity3d,有没有可能得到一个非常快速但可靠的(相同的输入=相同的输出,所以我不能使用时间)伪随机数生成器?我希望最终结果类似于floatnumgen(intx,inty,intseed)以便它基于这三个值创建一个介于0和1之间的随机数。我发现了几个随机数生成器,但我无法让它们工作,而Unity附带的随机数生成器使用起来要慢得多。我必须每1米地形打9次电话给发电机,所以我不在乎它是否完全随机,只是它工作得非常快。有人知道适合我需要的算法吗?谢谢:)我想您必须在每次调用NumGen时创建一个随机实例。要使函数

有没有可能得到一个非常快速但可靠的(相同的输入=相同的输出,所以我不能使用时间)伪随机数生成器?我希望最终结果类似于
floatnumgen(intx,inty,intseed)
以便它基于这三个值创建一个介于0和1之间的随机数。我发现了几个随机数生成器,但我无法让它们工作,而Unity附带的随机数生成器使用起来要慢得多。我必须每1米地形打9次电话给发电机,所以我不在乎它是否完全随机,只是它工作得非常快。有人知道适合我需要的算法吗?谢谢:)

我想您必须在每次调用NumGen时创建一个随机实例。要使函数为相同的参数返回相同的数字,可以使用哈希函数

我测试了一些东西,这段代码的速度大约是重建随机数的3倍

另一种使用一些RSA方法的方法比新系统快约5倍。随机(种子):

static uint prime=4294967291;
静态uint ord=4294967290;
静态uint发生器=4294967279;
静态uint-sy;
静态单元x;
静态单元xy;
静态浮点getFloat(uint x、uint y、uint seed){
//将返回值1=>x>0;将“ord”替换为“prime”以获得1>x>0
//如果所有数据都符合ulong,只需调用一次modPow就足够了
sy=modPow(发电机,((乌龙)种子)1;
b=(b*b)%m;
}
返回(uint)ret;
}
我运行了一个生成100000个浮点的测试。我使用索引作为System.Random的种子,并作为floatHash的x参数(y和z为0)

系统随机:最小值:2.921559E-06最大值:0.9997979重复次数:0

floatHash MD5:Min:7.011156E-06 Max:0.9999931重复次数:210(返回值两次)

getFloat RSA:最小值:1.547858E-06最大值:0.9999989重复次数:190


我猜您必须在每次调用NumGen时创建一个随机实例。要使函数返回相同参数的相同数字,您可以使用哈希函数

我测试了一些东西,这段代码的速度大约是重建随机数的3倍

另一种使用一些RSA方法的方法比新系统快约5倍。随机(种子):

static uint prime=4294967291;
静态uint ord=4294967290;
静态uint发生器=4294967279;
静态uint-sy;
静态单元x;
静态单元xy;
静态浮点getFloat(uint x、uint y、uint seed){
//将返回值1=>x>0;将“ord”替换为“prime”以获得1>x>0
//如果所有数据都符合ulong,只需调用一次modPow就足够了
sy=modPow(发电机,((乌龙)种子)1;
b=(b*b)%m;
}
返回(uint)ret;
}
我运行了一个生成100000个浮点的测试。我使用索引作为System.Random的种子,并作为floatHash的x参数(y和z为0)

系统随机:最小值:2.921559E-06最大值:0.9997979重复次数:0

floatHash MD5:Min:7.011156E-06 Max:0.9999931重复次数:210(返回值两次)

getFloat RSA:最小值:1.547858E-06最大值:0.9999989重复次数:190


我认为您低估了
系统.Random
类。它的速度相当快。我相信您的速度减慢与在每次调用
NumGen
方法时创建
Random
类的新实例有关

在我的快速测试中,我能够使用
System.random
在大约1毫秒内生成100000个随机数

< >为了避免慢下来,在2D平面内考虑种子点。分散种子点,使它们覆盖不超过100000米的距离。然后计算(或计算)每米的最近种子点,并将该点作为种子用于<代码>系统。 是的,您将生成大量您永远不会使用的随机数,但它们实际上是免费的

伪代码:

double NumGen(x, y, distance, seed) {
  Random random = new Random(seed);
  double result = 0;
  for (int i=0; i<distance; i++) {
    result = random.NextDouble();
  }
}
double NumGen(x,y,距离,种子){
随机随机=新随机(种子);
双结果=0;

对于(int i=0;i我认为您低估了
System.Random
类。它的速度相当快。我相信您的速度减慢与在每次调用
NumGen
方法时创建
Random
类的新实例有关

在我的快速测试中,我能够使用
System.random
在大约1毫秒内生成100000个随机数

< >为了避免慢下来,在2D平面内考虑种子点。分散种子点,使它们覆盖不超过100000米的距离。然后计算(或计算)每米的最近种子点,并将该点作为种子用于<代码>系统。 是的,您将生成大量您永远不会使用的随机数,但它们实际上是免费的

伪代码:

double NumGen(x, y, distance, seed) {
  Random random = new Random(seed);
  double result = 0;
  for (int i=0; i<distance; i++) {
    result = random.NextDouble();
  }
}
double NumGen(x,y,距离,种子){
随机随机=新随机(种子);
双结果=0;

对于(int i=0;iYes,这是可能的。线性同余生成器是两行代码。我会研究
系统。随机生成。它确实使用时间,但如果你用时间交换种子,甚至将两者结合,你就会得到我认为你在这里描述的东西。@EricLippert我找不到一个方法来实现一个线性同余生成器来获取3 inputs和仍然工作0f-1f。@WoutervanderHouven这就是我使用的,但我每秒调用函数数百次,所以它们使用的复杂算法非常需要资源。明白了。所以仅仅生成一个10000个随机数的大序列并不能起到作用。另外一个复杂的问题是,你要生成例如,(100200)然后(100201)和(99200)等等的g数;坐标没有增加任何熵。我不知道有什么算法能满足你的要求,但我会考虑一下。是的,这是可能的。线性同余生成器是两行代码。我会研究
System.R
double NumGen(x, y, distance, seed) {
  Random random = new Random(seed);
  double result = 0;
  for (int i=0; i<distance; i++) {
    result = random.NextDouble();
  }
}