【问题标题】:Random number generator based on input Java基于输入Java的随机数生成器
【发布时间】:2021-09-03 00:51:10
【问题描述】:

我正在寻找一个随机数生成器,我可以使用种子创建它并接受两个输入 x 和 y 来生成数字。每次我对相同的种子使用相同的输入时,我都需要相同的数字。

我正在使用它在坐标网格中随机分配纹理,因此我需要它每次都相同。所以每次我在同一个种子中的 x = 100, y = 120 时,我都需要相同的随机数,以便在该位置分配相同的纹理。

我想我为什么要寻找某种基本的程序生成技术。我不能使用 Random 类,因为它给了我一个数字流,我必须使用 nextInt() 直到我得到我想要的。然后,如果我需要我通过的数字之一,我将不得不重新开始。如果我在一个有 1,000,000 块瓷砖的空间中远离原点,这将是一个大问题。

【问题讨论】:

  • 随机和相同的不行,你要求生成随机数但希望它在条件下是相同的。
  • 听起来是不是很像一种哈希?例如,简单地将 x 和 y 相乘有什么问题?您需要避免碰撞吗?
  • 本质上是三个值的随机分布函数。
  • 每次我对相同的种子使用相同的输入时,我都需要相同的数字。 - 这就是基于种子的随机生成器所做的。如果您提供相同的种子,它们会生成相同的序列。否则,请出示相关代码。
  • 基于单个种子需要生成多少个随机数?

标签: java random generator


【解决方案1】:

我可以建议根据种子将两个随机值相乘或相加。

public int random(int x, int y) {
        int i = new Random(x).nextInt();
        int j = new Random(y).nextInt();
        return i * j;
}

【讨论】:

  • return new Random((long) x *(long) y).nextInt();怎么样
  • 这非常接近工作,但如果我在 200、75 和 75、200 时得到相同的结果吗?
  • @JackThompson:是的,这是一个缺点。
【解决方案2】:

所以你不想要一个随机数,你只想要一个基于 2 个整数的数字。这可以通过乘法来完成,然后将它们映射到最大值。当然,这样做时你会得到相同的输出,但我想这是因为你没有成千上万的瓷砖。所以我做了这个函数,你可以用 getTile(x,y,maxX,maxY,max); 调用,其中 x 和 y 只是坐标,maxX 和 maxY 是网格的大小,max 是不同纹理的数量。

public static int getTexture(int x, int y, int maxX, int maxY, int max){
  float texture=x*y;
  texture/=maxX*maxY;
  texture*=max;
  return (int)texture;
}

【讨论】:

  • 我现在可能会使用像这样简单的东西,直到我找到更随机的东西。问题是我确实有成千上万的瓷砖。我也想在未来将这个数字生成器用于其他随机性更重要的事情。
【解决方案3】:

如果您主要担心坐标对 x,yy,x 不应该给出相同的结果,请以非对称方式组合它们。在您撰写有关图形和纹理的文章时,您可能会在索引概念上的二维对象(纹理、屏幕、某些东西)时遇到类似 x+y*width 的表达式,该对象实际上存储在一维数组中。所以只要你有一个width,一个x的上限,你就可以使用这个表达式来初始化Random

public static int random(int x,int y,int xbound,int range)
{
    return new Random(x+y*xbound).nextInt(range);
}
public static void main (String[] args) throws java.lang.Exception
{
    for(int y=0;y<=10;y++)
    {
        for(int x=0;x<=10;x++)
            System.out.printf("%4d",random(x,y,1000,101));
        System.out.println();
    }
}

生产

  67  97   5  36  88  17  27  57   8  38  48
  84  14  23  54   4  35  44  75  58  88  98
  63  94   2  33  85  14  24  54   5  35  45
  17  47  57  87  38  69  78   7  27  57  67
  32  63  72   2  54  84  93  23  75   4  14
  53  83  93  22  74   3  13  43  27  57  66
   9  39  49  79  30  61  70   0  51  82  91
  29  60  69 100  50  81  90  20  39  70  79
  45  75  85  14  66  97   5  35  87  17  26
  40  71  80  10  62  92   1  31  14  45  54
  20  50  60  90  41  72  81  10  62  93   1

作为它的output

这将在xy 保持低于xbound=65536 之前开箱即用。在此之上,您可以只写long xbound,它将达到 1600 万。之后,您最好使用位移位和异或,因为总和的部分将开始重叠。

【讨论】:

    猜你喜欢
    • 2016-05-24
    • 2017-03-22
    • 2015-12-06
    • 2021-04-26
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    相关资源
    最近更新 更多