我正在ReactNative中构建一个移动在线协作绘图应用程序。用户可以加入最多4个用户的房间,在这些房间中他们可以一起绘制并在相互可见的白板上看到彼此绘制的形状。
我想为4个用户分配一个独特的风格,例如:
// Styles are a mix of color and lineStyle to accommodate color blindness
const style1 = { color: "#fff", lineStyle: "dashed" }
const style2 = { color: "#0f0", lineStyle: "solid" }
但是,我想在客户端分配这些样式,而无需在服务器上集中管理和分配样式。
样式可以从4个或更多的集合中预定义,或者可以动态生成。房间必须处理用户离开和重新加入(例如手动或由于断开连接)以及用户离开和其他不同用户加入。在任何时间t,给定房间中的两个用户都不应该被分配相同的样式,并且给定的用户应该在他们在房间中的整个时间保持相同的样式并且如果他们快速连续地离开/重新加入则理想地回收相同的样式(例如,由于断开连接)。
我将使用像Ably这样的东西在客户端之间推送数据。
我可以使用Redis服务器端来维护哪些用户具有哪种风格的独特地图,但我宁愿在客户端进行以便于开发。
理想情况下,不同风格的数量会很少 - 我不想要一堆颜色距离较小的随机颜色。
因此,我有一个房间R,有4个随机用户user1,...,user4如何以极可能独特且没有碰撞的方式为每个用户分配样式?
如果一个风格确实是color
和lineStyle
的组合,那么你可以使用birthday problem或生日悖论的公式来评估碰撞的机会。
让我们用N
来表示不同的可能样式的数量(例如,8个colors
和5个lineStyle
,你将有5*8=40
可能的不同风格)。
然后,你可以计算出这样的概率:对于k
用户,他们都有不同的风格(注意你需要k<N
,或者你需要P(X)=0
):
P(X) = (1 - 1/N) * (1 - 2/N) * ... * (1 - (k-1)/N) = product_{i from 1 to k-1} (1 - i/n)
您可以按如下方式理解公式:
如果有2个用户,则他们具有不同风格的概率是user2具有与user1不同的样式的概率(此概率为1 - 1/N
)
对于第三个用户,您需要第一个和第二个用户具有彼此不同的样式,并且第三个用户具有与第一个和第二个不同的样式。
等等......
其中给出了上述公式。