我有一份实体清单。每个实体都包含一个数字,该数字包含实体已被选中的次数。我需要做一个函数,随机选择实体的n
(比如25%)。我想要做的是增加被选中次数最少的实体的概率。假设在5次运行后,实体被选中的时间可以在0到5之间,但我不希望有这样的差。我希望实体被选择的时间或多或少是相等的。
我如何编写一个函数来增加那些没有像其他实体那样经常被选中的实体的概率呢?
我能想到的一种方法是创建一个列表,列出更多的较少选择的实体,增加随机选择该实体的机会。有什么提示,建议,想法吗?
编辑:哇。不再是一个真正的问题,然后又重新开始。因为它不是一个真正的问题,它确实得到了很多答案和评论。谢谢你这么说。我从他们那里得到了我想要的。我有一些好主意要想出来测试一下。
发布于 2013-01-24 13:02:48
排序
可以根据表达式对项进行排序,其中在当前视图数和视图的最大数量之间选择一个随机数。这确保了具有高视图计数的项目更有可能被赋予一个较大的随机数。而视图计数低的项目更有可能是随机化的。
按照以下表达式random(item.views,max_viewx+1)
对列表进行排序
我给出了max_views+1
,这样一个新的带有0
视图的项列表仍然会产生一个随机排序顺序。
进行测试
我想有一天我可以在博客上使用它。因此,这里尝试将此方法验证为MySQL表。
首先创建一个基本的articles
表。
CREATE TABLE `articles` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`title` VARCHAR(45) NOT NULL ,
`views` INT NOT NULL DEFAULT 0 ,
PRIMARY KEY (`id`) );
现在插入一些具有不同视图计数器的项目。
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
放在底部,但我们希望这感觉是随机的。
SELECT * FROM `articles`
ORDER BY `views`+(RAND()*(100-`views`+1));
这对我来说是有效的,将Product - ZZZ
放在100%的底部,但是低视图项更有可能在列表中被排序得更高。
SELECT * FROM `articles`
ORDER BY `views`+(RAND()*(100-`views`+25));
通过将+25
添加到ORDER BY
中,我就可以将列表中的Product - ZZZ
稍微提高一些,并使其余的项目更加随机。所以你可以控制随机效应。
发布于 2013-01-24 12:24:35
首先,值得指出的是,如果您的选择函数确实是随机的(甚至是令人信服的伪随机),那么从长远来看,所有项目的选择数量都是相同的。
我可以想出很多方法来实现你想要的。这里有一个:
如何调整权重将对算法产生很大影响,但我建议如下:从所选项目的权重中减去1.0,并将1/(n-1)添加到所有其他项目的权重中。
发布于 2013-01-24 12:27:41
选择实体的时间平均为相等.给你足够的时间和选择。确实有一个机会,一个实体可以获得幸运和赢得前5次赌博。但这很少见。总的来说,我想说你不必担心这个问题。
但是,如果你想要这是不可能的,只需将任何一个实体排除在彩票之外,因为它有超过标准偏差的胜利者。在较低的数字下,这将排除任何赢得一次赌博的人。
请注意,这是一个游戏,游戏玩家特别热衷于当机会已经被篡改。如果一个人连赢两次,他们会注意到的。
https://softwareengineering.stackexchange.com/questions/184717
复制