获取具有两个种子的静态随机值



编辑2:新的解释,因为看起来我的问题很模糊。我的问题是 用户 Boriaz50 已经回答:

  1. 我想要一个类似随机的函数,如果我输入两组种子/键,它将返回一组静态值,该值将转换为范围 使用伪随机数生成器 (PNRG) 算法的数字(例如 1-99) (由用户boriaz50回答。查看他的线性同余生成器 他的示例或下面的代码进行修改)。
  2. 我不使用 System.Random 的原因是因为我无法设置该函数的第二个种子/密钥。System.Random似乎使用"0"作为 第二个种子/密钥,每次我使用 Next() 时,该密钥都会增加 一。这意味着如果我更改使用的位置或行的数量 next() 函数,然后整个结果将改变(使得没有 点记住下一个程序构建的种子)。编辑 3:只需在 boriaz50 中实现第一次代码调用"新随机",它的种子/键不断重置使其成为一个工作解决方案。

public int RandomGenerator(int seed1, int seed2, int minRange, int maxRange)
{
long temp = seed1;
for(int i = 0; i < seed2; i++)
{
temp = (48271 * temp) % int.MaxValue;
}
int result = (int)(minRange + temp % maxRange);
return result;
}

假设我有两个种子并且我想获得 1-99 之间的随机值,如何每次都获得相同的数字。

在 c# 中有一个 System.Random 函数,但它使用 next(),这意味着假设我知道两个种子,我无法猜测出来的数字。c# 中是否有另一个函数能够实现我的目标?

int gameSeed = 123;
public void GenerateAgeList(){
GenerateAge(1); //Always return for example 23
GenerateAge(2); //Always return for example 34
GenerateAge(1); //Since the popSeed is also one also return 23
for(int i = 1; i<5 ; i++){
GenerateAge(i);
} // Always return for example 23,34,10,...
}
public int GenerateAge(int popSeed){
return unknownFunction(gameSeed,popSeed,1,99));
}

编辑 1:我不使用 System.Random Next() 的原因是,如果我添加和/或删除使用 Next() 的变量,那么结果就会改变。

void GenerateHuman(int seed){
Random rnd = new Random(seed); //Say the seed are 1
Human i = new Human();
i.age = rnd.Next(1,99); //randomly return 36
i.strength = rnd.Next(1,20); //randomly return 4
}
//Say in few month i added new level var to the code
void GenerateHuman(int seed){
Random rnd = new Random(seed);
Human i = new Human();
i.age = rnd.Next(1,99); //still 36
i.level = rnd.Next(1,5); //randomly return 1
i.strength = rnd.Next(1,20); //not 4 but 19
}
//Then say i find the age not necresarry and delete it
void GenerateHuman(int seed){
Random rnd = new Random(seed);
Human i = new Human();
i.level = rnd.Next(1,5); //not 1 but 2
i.strength = rnd.Next(1,20); //not 19 but 4
}

如果你有两个种子,你可以用多种方式将它们组合在一起,创建一个种子。例如,您可以使用如下Random

Random r = new Random(gameSeed ^ popSeed);

对于给定的种子,Next是确定性的,因此只需调用r.Next(1, 99)应该可以正常工作。

似乎您想像静态数字集合一样使用您的方法。您可以通过更改游戏种子来生成新集合。

实现目标的最简单方法:

public int GenerateAge(int popSeed)
{
return new Random(gameSeed ^ popSeed).Next(1, 99);
}

由于 Random 类没有重置其状态的方法,因此每次需要值时都需要创建新对象。这种情况可能是不需要的。

解决方案可以是线性同余生成器:

public int GenerateAge(int popSeed)
{
long age = gameSeed;
for (int i = 0; i < popSeed; ++i)
{
age = (48271 * age) % int.MaxValue;
}
return (int)(1 + age % 99);
}

System.Random有一个接受种子的构造函数:

如果你有两个种子,只需以你想要的任何方式组合它们:

var random = new Random(gameSeed ^ popSeed);
var n = random.Next(1, 99); // Will give a deterministic answer

最新更新