【问题标题】:Generate unique number within range based on given number or string根据给定的数字或字符串生成范围内的唯一数字
【发布时间】:2012-12-02 05:05:45
【问题描述】:

我想要实现的是这样的事情,假设我们有一个包含 1000 个盒子的列表和一个包含 25 种颜色的列表,现在我们要为盒子分配颜色,这样颜色就来自给定的列表,并且每个当我向盒子询问颜色时,将选择相同的颜色。同一个颜色可以被多个盒子使用,但是无论我执行多少次算法,同一个盒子的颜色总是相同的。

我想我可以有一个包含 25 种颜色的列表和一个算法来根据盒子的名称或 id 创建一个唯一编号(在 25 范围内)。

谁能帮我什么算法适合我?

更新 要求略有变化,现在我需要该范围内的五种独特颜色,并且颜色必须始终相同。假设我们以五个一组的方式排列盒子,每个盒子应该在 25 种颜色范围内获得唯一的颜色。并且算法应该始终为同一组提供相同的颜色。

【问题讨论】:

    标签: java algorithm random sampling


    【解决方案1】:
    box.getId().hashCode() % 25
    

    将为您提供一个介于 0 和 24(含)之间的数字。

    请注意,由于您没有为框之间的颜色分布指定任何规则,因此以下算法也可以满足您的要求:

    return 0;
    

    如果你想要一个良好的分布,那么遍历你的盒子,并填写一个Map<String, Integer>,其中键是盒子 id,值是颜色:

    Map<String, Integer> colorsByBoxId = new HashMap<String, Integer>();
    int i = 0;
    for (Box box : boxes) {
        int colorIndex = i % 25;
        i++;
        colorsByBoxId.put(box.getId(), colorIndex);
    }
    

    然后每次你想得到一个盒子的颜色时都使用这个地图。

    或者简单地做同样的事情,在 Box 类中添加一个color 字段。

    【讨论】:

    • 感谢您的回复,显然我想要良好的分布,希望使用所有 25 种颜色。按照您的建议创建地图是不可行的,因为我们无法将数千个对象加载到内存中
    • 你有一个包含一千个盒子的列表。这将导致一个很小的映射,在内存中只保存几个 KB。但如果这太多了,那么请确保您的 ID 分布良好,并使用 ID 的 hashCode。
    • 这只是我试图解决的问题的一个例子,但实际上,它不是盒子,它是其他一些实体,我们有数千条记录。是的,我认为 db id % 25 也应该可以工作,不是吗?
    • 如果ID是一个序列号,每创建一个新盒子就加1,你就会有一个完美的分布。如果每次创建一个新盒子时它是一个增加 25 的数字,那么分布将很糟糕,因为模数将始终返回相同的值。如果它是一个随机的 UUID,你可以期待一个良好的分布。但是为什么不每次创建并存储在数据库中时为框分配随机颜色呢?
    • ID 加一 - 是的,存储颜色也不应该是个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2021-08-27
    • 2013-02-15
    • 2022-01-04
    • 2011-02-03
    相关资源
    最近更新 更多