无连续重复的随机算法

  在开发中需要用到后台多台机器的任务分配,最简单的方式当然是轮询,建立一个闭环就可以实现一直轮询。这里我想用一个随机算法,这样对于不同机器有权重就可以更方便的控制。但是会存在一定概率连续选择一个机器,这样会造成系统瞬间负载很高,所以我想做一个简单的随机算法能不连续选择一个值,这样最坏的情况也是单节点50%的总负载。

  最简单的随机,就是给你一个长度为size的list数组,你每次选取list[(int) (size*random)]就可以了。

  但我的想法和轮询的思路更接近,我们同样把数值视为闭环,为了防止下次会选择上一次的节点,那么每次选取就从上一次选中节点的下一个开始,随机步长为(size - 1) * random,这样就在上一次节点上加上这个随机步长即可。最后这个公式就是list[lastindex + 1 + (int) ((size - 1) * random)]。

  如果需要对不同机器设置权重,就可以对每个节点的数值范围加大,比如节点1权重是10,节点2权重是5,那么节点1的值域就是1到10,节点2的值域就是11到15,然后随机就从1到15之间取即可。

 其实这个小算法主要是开拓一下思路,但是也不能避免瞬间负载很高的情况,只能算是对简单随机的一种粗略优化。



本文转自passover 51CTO博客,原文链接:http://blog.51cto.com/passover/521680,如需转载请自行联系原作者

上一篇:【小Y学算法】⚡️每日LeetCode打卡⚡️——3.无重复字符的最长子串


下一篇:第五章 面向切面编程(AOP)之一