C++ 在2D数组中生成随机数时,是否可以保证特定数字的X数量

C++ 在2D数组中生成随机数时,是否可以保证特定数字的X数量,c++,c++11,random,C++,C++11,Random,我需要用随机数填充一个大小为n的2D数组,但是我需要将生成的随机数的n(n-1)/2*.2或.4或.8分散开来。有什么可能的方法可以做到这一点吗?我经常在填充数组时考虑,将该元素设置为-1,并使用计数来跟踪,但是无法确保这些-1分散在整个数组中,这可能吗?如果设置数组是一次性操作(也就是说,您不需要不断地更改元素,也不希望-1值的比例保持不变(1)),您可以首先不使用-1值填充数组,类似于(伪代码): 然后,您只需在填充后将给定数量的代码更改为-1: for index in 0 .. arra

我需要用随机数填充一个大小为
n
的2D数组,但是我需要将生成的随机数的
n(n-1)/2*.2
.4
.8
分散开来。有什么可能的方法可以做到这一点吗?我经常在填充数组时考虑,将该元素设置为
-1
,并使用计数来跟踪,但是无法确保这些
-1
分散在整个数组中,这可能吗?

如果设置数组是一次性操作(也就是说,您不需要不断地更改元素,也不希望
-1
值的比例保持不变(1)),您可以首先不使用
-1
值填充数组,类似于(伪代码):

然后,您只需在填充后将给定数量的代码更改为
-1

for index in 0 .. array.size() / 5:  # 20%
    index = random(array.size())
    do:
        index = random(array.size())
    while array[index] == -1
    array[index] = -1


(1) 如果数组不断变化,您仍然可以使用此方法,您只需跟踪
负一个
而不是负一个
计数并动态调整。这有点复杂,但仍然可行。

我能想到的最简单的方法是:

  • 用所需数量的
    -1
    填充阵列的开头
  • 用随机数填充数组的其余部分
  • 洗牌数组,可能使用
    std::random\u shuffle
    或类似方法

执行此操作后,您可以确保拥有正确数量的
-1
s,并且它们将随机分布。

可能只是在开始时生成
X
索引(检查重复项)并将其设置为-1,然后遍历并将每个插槽设置为一个随机数,如果它不是-1。应该这样做。如果它只是一个普通的2d数组,则可以执行
std::random_shuffle(&array[0][0],&array[0][0]+width*height)
std::random_shuffle(&array[0][0],&array[width-1][height-1])
。如果您希望您的解决方案能够使用C++14以后的版本,请查看
std::shuffle
。如果出于某种原因,这些解决方案不起作用,请查看。
for index in 0 .. array.size() / 5:  # 20%
    index = random(array.size())
    do:
        index = random(array.size())
    while array[index] == -1
    array[index] = -1