You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中生成仅包含1-9的随机数字字符串?

C#生成仅含1-9的随机数字字符串

直接可行的实现方案

核心思路是直接生成1-9的随机数,而非生成0-9后再过滤0,这样既高效又从根源避免0出现。

循环拼接写法

public static string GetRandomNonZeroDigitString(int length)
{
    if (length <= 0)
        throw new ArgumentOutOfRangeException(nameof(length), "字符串长度必须大于0");
    
    Random random = new Random();
    StringBuilder sb = new StringBuilder(length);
    
    for (int i = 0; i < length; i++)
    {
        // Next(1,10) 会生成1到9的整数(上限10是排他的)
        int digit = random.Next(1, 10);
        sb.Append(digit);
    }
    
    return sb.ToString();
}

LINQ简化写法

如果偏好简洁风格,用LINQ可以快速完成:

public static string GetRandomNonZeroDigitStringLinq(int length)
{
    if (length <= 0)
        throw new ArgumentOutOfRangeException(nameof(length), "字符串长度必须大于0");
    
    Random random = new Random();
    return new string(Enumerable.Repeat(0, length)
                                .Select(_ => (char)('0' + random.Next(1, 10)))
                                .ToArray());
}

重要注意点

  • 复用Random实例:如果短时间内多次调用生成方法,每次新建Random会因为系统时钟种子重复,导致生成重复的数字序列。建议把Random设为类的静态成员:
    private static readonly Random _randomInstance = new Random();
    
    public static string GetRandomNonZeroDigitString(int length)
    {
        if (length <= 0)
            throw new ArgumentOutOfRangeException(nameof(length), "字符串长度必须大于0");
        
        StringBuilder sb = new StringBuilder(length);
        for (int i = 0; i < length; i++)
        {
            sb.Append(_randomInstance.Next(1, 10));
        }
        return sb.ToString();
    }
    
  • 优先用StringBuilder:生成较长字符串时,StringBuilder比直接拼接字符串效率高很多——毕竟C#里字符串是不可变的,每次拼接都会创建新对象。

为什么之前会频繁出现0?

之前的代码应该是用了random.Next(0,10)生成0-9的数字,没做过滤,所以结果里自然会有0。换成random.Next(1,10)直接生成1-9的数字,就能彻底解决这个问题。

内容的提问来源于stack exchange,提问作者Akshay K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:01:34