【问题标题】:How do I generate a random uint with a maximum?如何生成具有最大值的随机 uint?
【发布时间】:2015-07-16 10:18:39
【问题描述】:

如何在 C# 中生成具有某个最大值的伪随机 uint? (不需要最低限度。)似乎有很多问题要求完全随机,但没有上限。

澄清:此上限可能大于int.MaxValue,因此仅转换Random.Next(int) 无济于事。

【问题讨论】:

  • @TimSchmelter 返回int。我需要一个uint
  • 您可以将 int 转换为 uint。
  • 请尝试做一些研究并展示一些研究(您发现了哪些问题?)并展示您的代码以及它是如何不起作用的。如果您不能:请参阅duplicate
  • @TimSchmelter 是的,但这不会让我使uintint.MaxValue 更大,因为这是一种可能性。

标签: c# random


【解决方案1】:

您可以简单地在Int32.MinValueIn32.MaxValue 之间生成一个数字,然后将范围上移一半:

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

【讨论】:

  • 我不敢相信我没有想到这一点......但你不会使用random.Next(Int32.MinValue, Int32.MinValue + maximum)吗? (考虑到第一个int可能大于Int32.MaxValue / 2,导致溢出?
  • 我觉得数学有点不对劲。感谢您的接受。
  • 当然。似乎是最好的解决方案。
  • 这似乎无法正常工作。我找到的唯一可行的解​​决方案是stackoverflow.com/a/17080161/1365061
  • @Alex 你能解释一下为什么会这样吗?
【解决方案2】:

想法是生成随机的 4 字节数组,然后转换为 Int32UInt32 都取决于你:

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

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

【讨论】:

    【解决方案3】:

    这个技巧可以做到

        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);
    
        }
    

    【讨论】:

      【解决方案4】:

      首先,新建一个随机类的对象:

      随机 r = new Random();

      然后,把你的数字拿出来:

      int myRandomNumber = r.Next(myMaximum + 1);

      所以 r.Next(10) 将返回一个数字 1-9(包括 1-9)。

      最后,将其转换为 uint: myRandomUInt = (UInt)myRandomNumber;

      【讨论】:

        猜你喜欢
        • 2012-03-18
        • 2023-04-10
        • 2018-11-10
        • 2011-08-28
        • 2019-02-18
        • 2016-12-10
        • 2017-05-11
        • 1970-01-01
        • 2021-10-15
        相关资源
        最近更新 更多