如何使用仅设置一次的随机值中的值

本文关键字:一次 随机 何使用 设置 | 更新日期: 2023-09-27 18:35:55

我试图在随机基础上的 15 个数组值之间进行选择。我面临的问题是,我希望在程序期间只生成一次值。生成所有 15 个数字后,程序结束。

所以我的问题是,你如何确保一个值在程序期间只生成一次。

       int[] ImageValues = new int[15];
       ImageValues[0] = 1;
       ImageValues[1] = 2;
       ImageValues[2] = 3;
       ImageValues[3] = 4;
       ImageValues[4] = 5;
       ImageValues[5] = 6;
       ImageValues[6] = 7;
       ImageValues[7] = 8;
       ImageValues[8] = 9;
       ImageValues[9] = 10;
       ImageValues[10] = 11;
       ImageValues[11] = 12;
       ImageValues[12] = 13;
       ImageValues[13] = 14;
       ImageValues[14] = 15;
       Random randomize = new Random();
       int initialValue = randomize.Next(0, 15);
       int finalValue = ImageValues[initialValue];

如何使用仅设置一次的随机值中的值

首先,您还可以在声明数组时初始化数组,并且该类还应该有一个 Random 对象,以便您可以重用它,而不是每次都创建一个新对象。 所以,也许在ctor中:

rand = new Random();
int[] ImageValues = new int[15]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

您可以使用单行来随机/随机播放它:

ImageValues = ImageValues.OrderBy(i => rand.Next()).ToArray();

这在许多情况下都很好用。 标准的费舍尔-耶茨洗牌被认为是快速的,并且产生一个无偏的顺序(如果使用得当),所以在某些情况下它可能更好:

private void ArrayShuffle(int[] items)
{
    // uses the Random var declared earlier 
    int tmp = 0;
    int j = 0;
    // hi to low, so the rand result is meaningful
    for (int i = items.Count() - 1; i >= 0; i += -1)
    {
        j = rand.Next(0, i + 1);     // NB max param is EXCLUSIVE
        tmp = items[j];
        // swap  j and Card i 
        items[j] = items[i];
        items[i] = tmp;
    }
}

无论哪种方式,一旦数组被洗牌,您就可以通过在构造函数中传递数组来创建StackQueue

int[] ImageValues = new int[15];
 // ...
ArrayShuffle(ImageValues);
Stack<int> mystack = new Stack<int>(ImageValues);

您可以只使用数组和指向要使用的索引的变量。 使用集合类型消除了对该索引 var 的需求,以及在它不递增时出现错误的机会。 对于像纸牌游戏这样的东西,它模仿从牌组顶部发下一张牌:

// ToDo: 
// check myStack.Count() if times used is not controlled elsewhere
int nextVal = myStack.Pop();

一个简单、有效的解决方案是这样的:

假设您有 N 个元素可供选择。

  1. 从 0 到 N-1 随机选取一个索引,并删除选取的值从数组。
  2. 将数组的最后一个元素复制到已删除的索引。
  3. 重复步骤 1-2,将数组视为短一个元素,因此第二次选择介于 0 和 N-2 之间的索引,然后选择 0 和 N-3 等。

这保证了您可以在 K 次迭代中挑选任何 K 元素(因此算法是确定性的),并保证均匀分布。另一个好处是它不需要任何额外的内存分配。

最简单的解决方案是首先创建一个值列表...1-15,然后随机生成一个介于 0 和 14 之间的数字。

然后,从该位置获取值并将其从列表中删除。 然后生成一个介于 0 和 13 之间的新随机数。 依此类推,直到您删除了所有数字。