首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >随机从增加赔率的列表中选择

随机从增加赔率的列表中选择
EN

Software Engineering用户
提问于 2013-01-24 19:42:18
回答 5查看 2.3K关注 0票数 2

我有一份实体清单。每个实体都包含一个数字,该数字包含实体已被选中的次数。我需要做一个函数,随机选择实体的n (比如25%)。我想要做的是增加被选中次数最少的实体的概率。假设在5次运行后,实体被选中的时间可以在0到5之间,但我不希望有这样的差。我希望实体被选择的时间或多或少是相等的。

我如何编写一个函数来增加那些没有像其他实体那样经常被选中的实体的概率呢?

我能想到的一种方法是创建一个列表,列出更多的较少选择的实体,增加随机选择该实体的机会。有什么提示,建议,想法吗?

编辑:哇。不再是一个真正的问题,然后又重新开始。因为它不是一个真正的问题,它确实得到了很多答案和评论。谢谢你这么说。我从他们那里得到了我想要的。我有一些好主意要想出来测试一下。

EN

回答 5

Software Engineering用户

发布于 2013-01-24 21:02:48

随机范围

排序

可以根据表达式对项进行排序,其中在当前视图数和视图的最大数量之间选择一个随机数。这确保了具有高视图计数的项目更有可能被赋予一个较大的随机数。而视图计数低的项目更有可能是随机化的。

按照以下表达式random(item.views,max_viewx+1)对列表进行排序

我给出了max_views+1,这样一个新的带有0视图的项列表仍然会产生一个随机排序顺序。

通过SQL

进行测试

我想有一天我可以在博客上使用它。因此,这里尝试将此方法验证为MySQL表。

首先创建一个基本的articles表。

代码语言:javascript
代码运行次数:0
运行
复制
CREATE  TABLE `articles` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `title` VARCHAR(45) NOT NULL ,
  `views` INT NOT NULL DEFAULT 0 ,
  PRIMARY KEY (`id`) );

现在插入一些具有不同视图计数器的项目。

代码语言:javascript
代码运行次数:0
运行
复制
INSERT INTO `articles` (`title`, `views`) VALUES ('Home Page', 20);
INSERT INTO `articles` (`title`, `views`) VALUES ('Portfolio', 10);
INSERT INTO `articles` (`title`, `views`) VALUES ('Contact Us', 5);
INSERT INTO `articles` (`title`, `views`) VALUES ('Product - ABC', 2);
INSERT INTO `articles` (`title`, `views`) VALUES ('Product - SHR', 1);
INSERT INTO `articles` (`title`, `views`) VALUES ('Product - DBS', 0);
INSERT INTO `articles` (`title`, `views`) VALUES ('Product - ZZZ', 100);

现在,我可以按views列进行排序,将Product - ZZZ放在底部,但我们希望这感觉是随机的。

代码语言:javascript
代码运行次数:0
运行
复制
SELECT * FROM `articles`
    ORDER BY `views`+(RAND()*(100-`views`+1));

这对我来说是有效的,将Product - ZZZ放在100%的底部,但是低视图项更有可能在列表中被排序得更高。

代码语言:javascript
代码运行次数:0
运行
复制
SELECT * FROM `articles`
    ORDER BY `views`+(RAND()*(100-`views`+25));

通过将+25添加到ORDER BY中,我就可以将列表中的Product - ZZZ稍微提高一些,并使其余的项目更加随机。所以你可以控制随机效应。

票数 4
EN

Software Engineering用户

发布于 2013-01-24 20:24:35

首先,值得指出的是,如果您的选择函数确实是随机的(甚至是令人信服的伪随机),那么从长远来看,所有项目的选择数量都是相同的。

我可以想出很多方法来实现你想要的。这里有一个:

  • 给每个项目一个初始权重,比如说,1.0。
  • 排列列表中的所有项目。根据项目的权重对列表进行排序。
  • 选择新项时,使用随机函数在0和所有项的权重之和之间选择一个数字。接下来,从列表的开头开始添加项目的权重,直到达到您刚才选择的数字为止。选择那个项目。
  • 最后,您需要调整权重并确保列表保持排序(要么再次排序,要么以维护排序的方式进行调整)。

如何调整权重将对算法产生很大影响,但我建议如下:从所选项目的权重中减去1.0,并将1/(n-1)添加到所有其他项目的权重中。

票数 1
EN

Software Engineering用户

发布于 2013-01-24 20:27:41

选择实体的时间平均为相等.给你足够的时间和选择。确实有一个机会,一个实体可以获得幸运和赢得前5次赌博。但这很少见。总的来说,我想说你不必担心这个问题。

但是,如果你想要这是不可能的,只需将任何一个实体排除在彩票之外,因为它有超过标准偏差的胜利者。在较低的数字下,这将排除任何赢得一次赌博的人。

请注意,这是一个游戏,游戏玩家特别热衷于当机会已经被篡改。如果一个人连赢两次,他们会注意到的。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/184717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档