c# - 随机不是那么随机,在 Windows Phone 7 上有随机类

标签 c# windows-phone-7 random

所以,这是交易。

我已经为 wp7 设置了一个应用程序,其中有一个包含 50 个引号的数组。当用户单击按钮时,会显示数组中的随机引号。问题是,引号总是以相同的顺序出现。例如,引号为 1-50。顺序始终为 2、4、20、31、10... 有办法解决这个问题吗?我希望每次使用该应用程序时都会出现随机且不同的报价。

代码如下:

    string[] listaCantadas;
    Random r1, r2;

    public MainPage()
    {
        InitializeComponent();

        listaCantadas = new string[]
        {"//set of quotes
        };

        r1 = new Random(100);
        r2 = new Random(r1.Next(0, 50));
    }

    //click event for display a random quote

            int Cantada = r2.Next(0, listaCantadas.Length - 1);
            txtBlockCantada.Text = listaCantadas[Cantada];

        });
    }

最佳答案

您使用 Random(100) 创建您的第一个 Random 实例,即常量种子。所以它总是会返回相同的序列。这反过来意味着 Random 的第二个实例的种子也将是常量,它返回的所有值也是如此。

只需使用默认构造函数创建 Random 的单个实例,即 new Random()。这是随时间播种的,因此在程序的不同运行之间可能会有所不同。

警告:由于时间仅每隔几毫秒更改一次(在典型的 Windows 计算机上为 1-16 毫秒),如果您使用默认构造函数快速连续创建多个 Random 实例,它们很可能都会返回相同的顺序。

另一个常见的陷阱是 Random 不是线程安全的。但看起来你不会遇到这个问题。

string[] listaCantadas;
Random r;//No need for more than one instance

public MainPage()
{
    InitializeComponent();

    listaCantadas = new string[]
    {"//set of quotes
    };

    r = new Random();
}

//click event for display a random quote

        int Cantada = r.Next(0, listaCantadas.Length - 1);
        txtBlockCantada.Text = listaCantadas[Cantada];

    });
}

关于c# - 随机不是那么随机,在 Windows Phone 7 上有随机类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7661166/

相关文章:

java - 为什么 Java 和 C# 将 main 函数放在类中?

c# - .NET 库绘制路线避开障碍物

python - while 循环打印 1 到 10 之间的随机数并在数字为 N 时停止

javascript - 类似 PRNG 的种子哈希函数

c# - 从 int 获取枚举值

c# - 返回一个 IQueryable<dynamic> 以在父方法中进行过滤

c# - 以编程方式关闭 WP7 Coding4Fun 工具包 MessagePrompt 控件

c# - 如何简单的访问网盘,读写文件?

linq - 将对象写入表时超过 8060 字节 - Windows Phone 7.5

python - python中的牌组卡类