如何生成一个最大值内的随机正整数?

3
在C#中,如何生成一个带有最大值的伪随机uint?(不需要最小值。)似乎有很多问题要求完全随机,但没有一个带有上限的问题。
澄清一下:这个上限可以超过int.MaxValue,所以只转换Random.Next(int)是没有用的。

1
(uint)random.Next(10000)? - Tim Schmelter
@TimSchmelter 这将返回一个 int。我需要一个 uint - AlphaModder
你可以将 int 类型强制转换成 uint 类型。 - CodeCaster
@TimSchmelter 对,但这样做不能让我创建一个比int.MaxValue更大的uint,这就失去了意义,因为这是有可能的。 - AlphaModder
@AlphaMCubed:你的问题中没有说明。如果该值大于“int.Maxvalue”,你想发生什么? - Tim Schmelter
显示剩余5条评论
4个回答

7

您可以简单地生成介于Int32.MinValueInt32.MaxValue之间的数字,并将其向上移动半个范围:

var random = new Random();
int number = random.Next(Int32.MinValue, Int32.MaxValue);
uint uintNumber = (uint)(number + (uint)Int32.MaxValue);

1
我简直不敢相信我没想到这个...但是你难道不会使用 random.Next(Int32.MinValue, Int32.MinValue + maximum) 吗?(考虑到第一个整数可能比 Int32.MaxValue / 2 更大,导致溢出) - AlphaModder
我认为数学有点偏差。不过还是谢谢你的接受。 - CodeCaster
当然没问题。看起来是最好的解决方案。 - AlphaModder
这似乎不能正常工作。我找到的唯一有效的解决方案是 https://dev59.com/JGQn5IYBdhLWcg3wIUJn#17080161 - Alex
@Alex,你能解释一下为什么看起来是这样吗? - CodeCaster

3

这个想法是生成一个随机的4字节数组,然后无论你将其转换成Int32还是UInt32都可以,这取决于你:

var buffer = new byte[sizeof(uint)];
new Random().NextBytes(buffer);
uint result = BitConverter.ToUInt32(buffer, 0);

result = (result % (max - min)) + min;

0

这个技巧可以解决它

    static void Main(string[] args)
    {
        uint MaxValue = 5555;
        uint value;
        var rnd = new Random();
        var bytes = new byte[4];

        do
        {
            rnd.NextBytes(bytes);
            value = BitConverter.ToUInt32(bytes, 0);
        } while (value > MaxValue);

    }

-3
首先,创建一个随机类的新对象:
Random r = new Random();
然后,从中获取你的数字:
int myRandomNumber = r.Next(myMaximum + 1);
所以r.Next(10)会返回一个1-9的数字。
最后,将其转换为无符号整数: myRandomUInt = (UInt)myRandomNumber;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接