【发布时间】:2020-05-27 00:53:13
【问题描述】:
我有一个整数的一维数组,在某些索引处具有非零值,其余为零。非零值等于索引。例如:
CHOOSEARRAY = (/0,0,0,4,0,6,7/)
我想从这个数组中随机选择任何非零元素。在这种情况下,我希望输出为 4,6 或 7 的概率相等。
我目前的方法有点复杂,工作方式如下:
计算可用选项的数量
NCHOICE = COUNT(CHOOSEARRAY.NE.0)
创建一个数组,并用非零值填充它
ALLOCATE(CHOICES(NCHOICE))
CHOICES = PACK(CHOOSEARRAY,CHOOSEARRAY.NE.0)
从这个新数组中选择一个随机元素
CHOSENVAL = CHOICES(FLOOR(1+GRND()*NCHOICE))
这里,GRND() 是一个随机数生成函数,输出一个均匀分布在 0 和 1 之间的实数。
此代码块必须重复多次,需要多次分配和解除分配操作,这可能很耗时。有没有更好的方法来解决这个问题?
或者,有没有办法返回随机选择的非零元素的索引?例如(/0,1,1,0,0,1/) 应该以相等的概率给出 2,3 或 6。
【问题讨论】:
-
您可以在没有
choices分配的情况下执行此操作,但您是否对此进行了分析以确定分配成本对您的案件或利益是否重要? -
你知道有多少个非零元素吗?
-
@IanBush,先验未知,因此分配和释放。
-
@francescalus 我没有对此进行分析,但该操作发生了超过 10,000 次。我的假设是,分配和解除分配通常不是提高速度的好主意。