请教抽奖算法 奖品是 1-100 元整数

2020-02-12 13:46:39 +08:00
 Windowsxpplayer

抽奖算法

奖品是 1-100 元整数

要求金额越大抽中概率越小, 可以设置数学期望。

各位有什么思路?

4068 次点击
所在节点    程序员
25 条回复
smdbh
2020-02-13 10:55:00 +08:00
最简单的方法,设一个数组, 数字越小,重复个数就越多,然后 随机函数抽一个。
coderEOS
2020-02-13 15:00:30 +08:00
@rets = [1, 2, 3, 4, 15]
@quan = [10, 30, 50, 70, 100]
@randMax = @quan.inject(:+)
def clacOneRet
randV = rand(@randMax) + 1
@quan.each_index do |i|
randV = randV - @quan[i]
return @rets[i] if randV <= 0
end
return -1
end

nums = {}
@rets.each {|k| nums[k] = 0}
for i in 1..1000
v = clacOneRet
nums[v] = nums[v].to_i + 1
end
puts nums ## {1=>31, 2=>123, 3=>182, 4=>263, 15=>401}
coderEOS
2020-02-13 15:35:17 +08:00
<body class="vscode-light">
<h1 id="%e5%85%b6%e5%ae%9e%e5%b0%b1%e6%98%af%e7%ae%80%e5%8d%95%e7%9a%84%e5%b8%a6%e6%9d%83%e7%ae%97%e6%b3%95">其实就是简单的带权算法</h1>
<pre><code class="language-ruby"><div>@rets = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">15</span>]
@quan = [<span class="hljs-number">10</span>, <span class="hljs-number">30</span>, <span class="hljs-number">50</span>, <span class="hljs-number">70</span>, <span class="hljs-number">100</span>]
@randMax = @quan.inject(<span class="hljs-symbol">:+</span>)
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">clacOneRet</span></span>
randV = rand(@randMax) + <span class="hljs-number">1</span>
@quan.each_index <span class="hljs-keyword">do</span> <span class="hljs-params">|i|</span>
randV = randV - @quan[i]
<span class="hljs-keyword">return</span> @rets[i] <span class="hljs-keyword">if</span> randV &lt;= <span class="hljs-number">0</span>
<span class="hljs-keyword">end</span>
<span class="hljs-keyword">return</span> -<span class="hljs-number">1</span>
<span class="hljs-keyword">end</span>

nums = {}
@rets.each {<span class="hljs-params">|k|</span> nums[k] = <span class="hljs-number">0</span>}
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-number">1</span>..<span class="hljs-number">1000</span>
v = clacOneRet
nums[v] = nums[v].to_i + <span class="hljs-number">1</span>
<span class="hljs-keyword">end</span>
puts nums <span class="hljs-comment">## {1=&gt;31, 2=&gt;123, 3=&gt;182, 4=&gt;263, 15=&gt;401}</span>
</div></code></pre>
pmispig
2020-02-13 19:29:37 +08:00
最简单的实现方法 100 元 = 1% 1 元=99%
这个几率太高的化,统一乘以一个比例
Windowsxpplayer
2020-02-14 22:56:13 +08:00
@st2udio 都是不限, 奖品不是现金而且余额

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/644011

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX