gpt4 book ai didi

c# - 在不超过一个值的情况下随机化值?

转载 作者:行者123 更新时间:2023-11-30 18:56:15 26 4
gpt4 key购买 nike

我花了一些时间思考以下问题,我想制作一个按钮来随机化某些技能的全部值。问题是我有 10 点分配给 4 个技能,我的想法是选择不超过 10 点的随机数字。

我是这么想的

public int startPts = 10, usedPts = 0;
public int skill1 = 0, skill2 = 0, skill3 = 0, skill4 = 0;

public void ButtonRandom(){
startPts = 10;
usedPts = 0;

skill1 = Random.Range( 1, 10 );
usedPts += skill1;

skill2 = Random.Range( 1, usedPts );
usedPts += skill2;

skill3 = Random.Range( 1, usedPts );
usedPts += skill3;

skill4 = startPts - usedPts;
usedPts += skill4;

startPts = startPts - usedPts;

}

我也尝试了几种条件和重复的方法,但我没有得到想要的结果。由于有时它会超过 10 个点,所以在我设置条件时不使用或仅更改前 2 个值而留下点。

谢谢你们。

最佳答案

如果您希望每个可能的分布均等,那么目前所提供的解决方案均无效。目前给出的解决方案选择 3, 3, 2, 2 的频率远高于 7, 1, 1, 1 的频率。你知道为什么吗?

如果您想要的分布在各种可能性上是均匀的,则此算法会为​​您提供:

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
// Partition n into m summands
static IEnumerable<IEnumerable<int>> Partitions(int n, int m)
{
// There is no partition of n into zero summands for any value of n other than zero.
// Otherwise, give the partitions that begin with 0, 1, 2, ... n.
if (m == 0)
{
if (n == 0)
yield return Enumerable.Empty<int>();
}
else
{
for (int nn = 0; nn <= n; ++nn)
foreach(var p in Partitions(n - nn, m - 1))
yield return (new[] { nn }).Concat(p);
}
}

public static void Main()
{
// Divide up six points into four buckets:
var partitions = Partitions(6, 4).ToArray();
// Now choose a random member of partitions, and
// add one to each element of that sequence. Now
// you have ten points total, and every possibility is
// equally likely.

// Let's visualize the partitions:
foreach(var p in partitions)
Console.WriteLine(string.Join(",", p));

}
}

关于c# - 在不超过一个值的情况下随机化值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42516806/

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