iOS随机分配一个整数

代码可以点击链接:https://github.com/Xiexingda/XDRandom.git
这里只说一下基本思路:
要想把一个整数 随机分成n份,首先我们要保证的是公平性,所以我们不能采用先给一个人随机分一份,接着再在剩下的数里给另一个人在随机分一份的方式,因为这种做法每分一次都会使下一个人的分配基数变小(拿100块为例子,第一个人从中随机分走了20,那第二个人只能从80里再进行随机分配),即对越靠后的人越不公平。

正确思路:

1.我们要保证每个人的随机概率是一样的
2.我们要保证每个人分配的基数是一样的
3.我们要保证随机后的数字总和 正好等于 总数(这点是必须的)

做法:

首先我们给每份随机分配一个【1-100】的数,并把这些数放入数组里,这样就保证了每个人的随机概率是一样的(因为【1-100】完全是随机分配的)

for (int i = 0; i < parts; i++) {
        valueArray[i] = @(arc4random()%100 + 1); //【1 - 100】
    }

然后我们把 所有分得的随机数 相加 得到随机总数

for (int i = 0; i < parts; i++) {
        totalvalue += [valueArray[i] floatValue];
    }

然后我们在用每份分得的随机数做份子,随机总数做分母去 乘以 要随机分配的那个整数(基数)。这样就保证了每份分配的基数是相同的。转换为数学表达式如下:
(每份的随机数) / (随机总数) x (基数)

([valueArray[i] floatValue])/totalvalue

由于 随机总数 = 所有每份随机数的总和
所有 (每份的随机数) / (随机总数) 的总和 = ((第一份随机数) + (第二份随机数) ....) / (随机总和) = (随机总和) / (随机总和) = 1

([valueArray[0] floatValue] + [valueArray[1] floatValue] + ...)/totalvalue

所以每份所分的数字相加就等于:
(第一份随机数) / (随机总数) x (基数) + (第二份随机数) / (随机总数) x (基数).... = (第一份随机数) / (随机总数) + (第二份随机数) / (随机总数)....) x (基数) = (随机总和) / (随机总和) x (基数) = (基数)
这样就保证了所有分得的数字总和 等于 总数

到此基本思路已经完成,但是只有这个思路是不够的,还有许多的细节问题要处理。细节问题这里就不写了,需要的话可以点击链接去看一下代码:
https://github.com/Xiexingda/XDRandom.git

你可能感兴趣的:(iOS随机分配一个整数)