申请人等于资源时的公平抽奖

时间:2016-12-15 20:25:45

标签: c# algorithm

请考虑这种情况:

他们可以放置7个申请人和7个地方。我想用这个标准运行一个算法7次:每个申请人都必须放在 ONCE 之一。例如,考虑第一个展示位置:

1
--
A
B
C
D
E
F
G

并且在第二回合中如果A再次选择,A不能放在第一位,因为它已经在第一个回合位置放在第一位:

1       2
-------------
A       B
B       A
C       F
D       G
E       C
F       D
G       E
在第二轮中,我认为B已经选择了第二位申请人,因为他没有排在第一位,所以他可以被放在第一位。

我希望每一个选择的申请人都可以放在以前没有的最高位置,每个人都可以进入每个地方

任何人都可以帮我写这样的算法。

1 个答案:

答案 0 :(得分:1)

简单算法应始终有效。

  • 生成七个申请人中每个可能WM_COMMAND的人。有 其中5040个。
  • 随机选择一个LRESULT WINAPI YourWindowProc(HWND hWnd, UINT nMsg, WPARAM wp, LPARAM lp) { switch (nMsg) { case WM_COMMAND: { switch (HIWORD(wp)) { case BN_CLICKED: { switch (LOWORD(wp)) { case IDC_BUTTON1: // or whatever the ID of your button is... { // do stuff for button... break; } } break; } } break; } default: return DefWindowProc(hWnd, nMsg, wp, lp); } return 0; } 并将其添加到sequence列表。
  • 然后重复以下步骤六次:
    • 计算与sequence列表中已有的任何chosen不冲突的sequence
    • 生成1到计数之间的随机数。
    • 找到与该随机对应的非冲突sequence 号。
    • chosen添加到sequence列表。

这是算法的典型输出。右边的数字是非冲突sequence的计数。

chosen

最后总会有一个有效的选择吗?是的,因为在前六个选项之后,只剩下一个地方放sequence,一个地方放1 BDCEFGA 5040 2 CADGBFE 1854 3 GBADCEF 579 4 DGBFEAC 144 5 ECFAGDB 26 6 FEGBACD 4 7 AFECDBG 1 等等。所以第七个选择总会有一个选择序列。证明对序列2到6有有效的选择留给读者练习。