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