使用openmp生成两个数组的唯一组合

时间:2018-12-17 12:15:47

标签: c algorithm parallel-processing openmp

我正在使用多线程(openmp)为扑克游戏编写C代码。我想做的是一个主线程,它定义了我的牌组,如下所示:

int values[13] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13 };
int suits[4] = {'D', 'H', 'S', 'C'};

然后4个从属可以从这52个牌组中生成5张卡(期望它们是唯一的),然后将它们保存在一个阵列中。

任何人都知道如何生成这样的序列?

1 个答案:

答案 0 :(得分:0)

您需要使用某种互斥锁才能使此工作生效。

要为每个玩家随机生成一张纸牌序列,您需要做两件事:

  1. 随机选择一张未被拿走的卡

  2. 一旦发现随机卡片未标记为“是”,以便其他线程知道该卡片未被标记

您可以采用以下代码流:

  1. 初始化并以0表示大小为52的数组,以标记该卡是否已被使用。

  2. 然后您可以创建4个线程。

  3. 每个线程将尝试获取互斥锁,并且一旦获取到互斥锁,它就会生成一个从0到51的随机数。

  4. 假设它有数字5,它将在数组中查找值为1或0的值,如果值为1,则表示它已经被占用,并再次生成一个新的数字,直到得到未使用的索引号。一旦获得未使用的索引,它将标记为已使用,然后将索引映射到卡值(红王或黑王牌等)(这取决于您使用的逻辑,因为您还需要定义哪个规则大于哪个规则)。

  5. 现在线程可以执行此操作,直到获得所有5张卡,或者它可能再次从0到1秒的随机时间进入睡眠状态,让其他线程尝试获取卡。

  6. 所有线程一旦获得5张卡,便可以开始游戏。

请参见,在处理胎面时,避免出现竞争状况(使用互斥锁)并在线程之间传递信息非常重要,例如,如果所有线程都有5张牌来开始游戏,那么他们将哪张牌放在桌子上,他们的赌注是什么等等

要传递信息,您可能需要一个中介(经销商),所有线程(玩家)都向该中介报告,并从中获取订单/状态,或者您可以允许玩家彼此交谈。