gpt4 book ai didi

javascript - 在 javascript 中,如何在控制总金额的同时向用户的余额添加随机金额?

转载 作者:行者123 更新时间:2023-11-30 16:36:25 25 4
gpt4 key购买 nike

我正在努力做到当用户执行某项操作时,他们会获得 2 到 100 个单位。但是对于每 1,000 个请求,我希望它总共提供 3,500 个单位。

这是我为用户随机添加不同金额的代码:

if (Math.floor(Math.random() * 1000) + 1 === 900) {
//db call adding 100
}
else if (Math.floor(Math.random() * 100) + 1 === 90) {
//db call adding 40
}
else if (Math.floor(Math.random() * 30) + 1 === 20) {
//db call adding 10
}
else if (Math.floor(Math.random() * 5) + 1 === 4) {
//db call adding 5
}
else {
//db call adding 2
}

如果我的计算是正确的,这应该平均每 1,000 次调用大约 4,332 个单元。但显然它会有所不同,我不希望那样。我还希望它添加随机数量,因为在我的示例中添加的单位是任意的。

编辑:伙计们,Gildor 是对的,我只想拥有 3,500 个单位,并在 1,000 个请求内赠送它们。它甚至不必总是达到 3,500 的最大值(我可以指定)。重要的是我不会给用户太多,同时为他们创造机会赢得更大的金额。

这是我现在设置的,它运行良好,并且通过一些调整会更好:

通话外:

var remaining = 150;
var count = 0;

调用内部:

    count += 1;
if (count === 100) {
remaining = 150;
count = 0;
}

if (Math.floor(Math.random() * 30) + 1 === 20) {
var addAmount = Math.floor(Math.random() * 85) + 15;
if (addAmount <= remaining) {
remaining -= addAmount;
//db call adding addAmount + 2
}
else {
//db call adding 2
}
}
else if (Math.floor(Math.random() * 5) + 1 === 4) {
var addAmount1 = Math.floor(Math.random() * 10) + 1;
if (addAmount1 <= remaining) {
remaining -= addAmount1;
//db call adding addAmount1 + 2

}
else {
//db call adding 2
}
}
else {
//db call adding 2
}

我想我应该澄清一下,我想要一个很可能很小的“随机”数字。这是噱头的一部分,你获得更大数量的可能性很小。

最佳答案

正如我所说,1000 个 2 到 100 之间的随机数加起来是 3500,平均数是 3.5,这与 2 到 100 之间的随机选择不一致。你必须拥有几乎所有的 2 和 3为了实现这一目标而设置的值,实际上不能超过几个大数字。没有什么是随机的。因此,要使这甚至是远程随机和可行的,您必须选择总数远大于 3,500。 2 到 100 之间的随机总数 1,000 个数字更像是 51,000。

此外,您无法以真正随机的方式动态生成每个数字并保证特定的总数。保证结果的主要方法是预先分配随机数,这些随机数加起来达到已知的总数,然后从预先分配的方案中随机选择每个数字,然后将其从选择中删除以供将来选择。

您也可以尝试保持运行总数并在您偏离总数时偏向您的随机性,但这样做,最后一组数字可能不得不甚至不接近随机才能达到您的要求总计始终如一。

如果您重置总数以支持实际随机性(例如,51,000)应该是什么,那么一个可行的方案是预先分配 2 到 100 之间的 500 个随机数的数组,然后添加另外 500 个数字,这些数字是那些的补充。这保证了 51 平均数。然后您可以从预先分配的数组中随机选择每个数字,然后将其从数组中删除,这样它就不会被再次选择。我可以立即添加代码来执行此操作。

function RandResults(low, high, qty) {
var results = new Array(qty);
var limit = qty/2;
var avg = (low + high) / 2;
for (var i = 0; i < limit; i++) {
results[i] = Math.floor((Math.random() * (high - low)) + low);
//
results[qty - i - 1] = (2 * avg) - results[i];
}
this.results = results;
}

RandResults.prototype.getRand = function() {
if (!this.results.length) {
throw new Error("getRand() called, but results are empty");
}
var randIndex = Math.floor(Math.random() * this.results.length);
var value = this.results[randIndex];
this.results.splice(randIndex, 1);
return value;
}

RandResults.prototype.getRemaining = function() {
return this.results.length;
}


var randObj = new RandResults(2, 100, 1000);

// get next single random value
if (randObj.getRemaining()) {
var randomValue = randObj.getRand();
}

真正随机选择的数字加起来为 51,000(这是 2 到 100 之间的 1,000 个随机值的总和)的工作演示:http://jsfiddle.net/jfriend00/wga26n7p/


如果您想要的是以下内容:从 2 到 100(含)范围内选择 1,000 个加起来等于 3,500 的数字,其中大多数数字将是 2 或 3,但偶尔也可能达到 100,那么那是一个不同的问题。我不会真的用随机这个词来形容它,因为它是一个高度偏向的选择

这里有一个方法可以做到这一点。它会生成 2 到 100 之间的 1,000 个随机数,并跟踪总数。然后,之后它通过随机选择的值来纠正随机数以达到正确的总数并递减它们直到总数下降到 3,500。你可以在这里看到它的工作:http://jsfiddle.net/jfriend00/m4ouonj4/

代码的主要部分是这样的:

function RandResults(low, high, qty, total) {
var results = new Array(qty);
var runningTotal = 0, correction, index, trial;
for (var i = 0; i < qty; i++) {
runningTotal += results[i] = Math.floor((Math.random() * (high - low)) + low);
}
// now, correct to hit the total
if (runningTotal > total) {
correction = -1;
} else if (runningTotal < total) {
correction = 1;
}
// loop until we've hit the total
// randomly select a value to apply the correction to
while (runningTotal !== total) {
index = Math.floor(Math.random() * qty);
trial = results[index] + correction;
if (trial >= low && trial <= high) {
results[index] = trial;
runningTotal += correction;
}
}

this.results = results;
}

虽然此方案中 2 的概率非常高,100 在这个方案中几乎不存在。


此外,这里还有一个加权随机生成器,可以计算出一个精确的总数。这使用三次加权方案来支持较低的数字(数字的可能性随着数字的立方下降)然后在生成随机数之后,校正算法对数字应用随机校正以使总数出来完全按照规定。工作演示的代码在这里:http://jsfiddle.net/jfriend00/g6mds8rr/

function RandResults(low, high, numPicks, total) {
var avg = total / numPicks;
var i, j;
// calculate probabilities for each value
// by trial and error, we found that a cubic weighting
// gives an approximately correct sub-total that can then
// be corrected to the exact total
var numBuckets = high - low + 1;
var item;
var probabilities = [];
for (i = 0; i < numBuckets; i++) {
item = low + i;
probabilities[i] = avg / (item * item * item);
}

// now using those probabilities, create a steps array
var sum = 0;
var steps = probabilities.map(function(item) {
sum += item;
return sum;
});

// now generate a random number and find what
// index it belongs to in the steps array
// and use that as our pick
var runningTotal = 0, rand;
var picks = [], pick, stepsLen = steps.length;
for (i = 0; i < numPicks; i++) {
rand = Math.random() * sum;
for (j = 0; j < stepsLen; j++) {
if (steps[j] >= rand) {
pick = j + low;
picks.push(pick);
runningTotal += pick;
break;
}
}
}

var correction;
// now run our correction algorithm to hit the total exactly
if (runningTotal > total) {
correction = -1;
} else if (runningTotal < total) {
correction = 1;
}

// loop until we've hit the total
// randomly select a value to apply the correction to
while (runningTotal !== total) {
index = Math.floor(Math.random() * numPicks);
trial = picks[index] + correction;
if (trial >= low && trial <= high) {
picks[index] = trial;
runningTotal += correction;
}
}
this.results = picks;
}

RandResults.prototype.getRand = function() {
if (!this.results.length) {
throw new Error("getRand() called, but results are empty");
}
return this.results.pop();
}

RandResults.prototype.getAllRand = function() {
if (!this.results.length) {
throw new Error("getAllRand() called, but results are empty");
}
var r = this.results;
this.results = [];
return r;
}


RandResults.prototype.getRemaining = function() {
return this.results.length;
}

关于javascript - 在 javascript 中,如何在控制总金额的同时向用户的余额添加随机金额?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32640030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com