【问题标题】:How to input a number and output a random number, yet keep output the same if given the same ID on a different machine如何输入一个数字并输出一个随机数,但如果在不同的机器上给定相同的 ID,如何保持输出相同
【发布时间】:2013-03-04 10:47:27
【问题描述】:

目前我正在用 scriptish 编写一个小脚本,它接受一个用户 ID(目前在我们的论坛上,我们的用户 ID 从 1 到 63)并使用以下函数用随机颜色对其进行着色:

function setNickColor(nick) 
var spans = nick.getElementsByTagName('span');
var uid = nick.getAttribute('hovercard-id');

if (colors[uid] == null)
    storeColor(uid, Math.random().toString(15).substring(2,8));

这给了我一个 24 位的随机颜色(用于 rgb 颜色),为每个安装脚本的人单独生成。我想让每个 ID 生成一个固定的随机颜色。我不明白如何将 ID 应用到函数中,以便它仍然是随机的,但仍然会生成随机颜色。

我查看了种子,但有点难以理解它们的作用,因为我对 javascript 非常陌生

【问题讨论】:

  • 固定和随机不要在一起。

标签: javascript random colors


【解决方案1】:

在我看来,您的解决方案有两个主要组成部分:

  1. 为用户 ID 生成随机颜色。
  2. 在后续请求中将此随机颜色与用户 ID 相关联。

既然你已经完成了第一个,那就留下第二个。以下是一些选项,具体取决于后端系统为您提供的灵活性:

  1. 您可以编写一个网络服务,从您的 javascript 函数中调用它。您的调用的有效负载将是用户 ID 和生成的颜色,您的 Web 服务将存储在后端数据库中。然后,如果未设置颜色,您的模板将检查每个用户,生成一个随机颜色并设置它(并刷新页面,以进行初始设置)。

  2. 您可以在浏览器中设置一个代表您生成的颜色的 cookie,然后加载此 cookie 并使用它来更改正在显示的用户 ID。这样做的缺点是它依赖于浏览器(在同一台机器上,在两个浏览器上,同一个用户 ID 可以有两种不同的颜色),如果用户清除了他们的 cookie,颜色将重新生成。

  3. 第三个选项是 Oleg 建议的 - 创建用户 ID 的一些哈希(它是一种单向算法,因此可以保证在相同输入的情况下获得相同的结果),然后将此哈希的一个组成部分作为你的颜色的基础。好处是您避免了 cookie 和网络服务问题;但挑战是你需要让你的颜色生成器更“随机”一点,因为你最终可能会得到视觉上不那么明显的颜色。

【讨论】:

  • 我觉得 Oleg 建议的哈希函数是目前最好的解决方案。但是,据我所知,javascript 中没有本机哈希函数吗?每次我用谷歌搜索公共哈希码时,它对于我的需求来说都过于复杂,并且最终会比我的原始代码大。您有什么建议可以缓解这种情况吗?
  • 您的意思不是#1 和#2? :)
  • 不幸的是,我几乎没有使用网络服务的经验。这实际上是我的最终计划(用户将能够在发送到 heroku 的浏览器中设置他们的颜色)但现在我只想在扩展之前坚持一个简单的解决方案,因为我在 3 小时前开始使用 javascript。
  • 最简单的选项是#2,用javascript设置一个cookie。
  • 不幸的是,代码不适合我自己,大约有 10 个人在使用它,我希望它对每个人都一样
【解决方案2】:

“固定”和“随机”是两个完全相反的东西。忘记随机。根据您的描述,您真的只是想要“固定”。

现在解决方案:获取 ID 的任意散列,然后将其减少到仅 3 个字节以形成与该 ID 对应的 RGB 值。

【讨论】:

  • 感谢您的回答。我一直在寻找谷歌,似乎所有哈希函数都过于复杂,无法满足我的需求。您是否特别推荐任何散列函数(据我所知,没有本机散列函数?)
  • 提示:也搜索“校验和”。在这种情况下,它与哈希相同。这个关于快速校验和的问题与 CRC32 的 JS 实现有链接,这对于您的目的应该足够了:stackoverflow.com/questions/421419/…
猜你喜欢
  • 2015-03-08
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
  • 1970-01-01
相关资源
最近更新 更多