随机不是随机的,在Windows Phone 7上随机类

Bog*_*oga 2 c# random windows-phone-7

所以,这是交易.

我为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];

        });
    }
Run Code Online (Sandbox Code Playgroud)

Cod*_*aos 14

你创造了你的第一个实例RandomRandom(100)即恒定的种子.所以它总会返回相同的序列.这反过来意味着你的第二个实例的种子Random也将是常量,并且它返回的所有值也是如此.

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

警告:由于时间只在每几毫秒(典型的Windows计算机上为1-16ms)发生变化,如果您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];

    });
}
Run Code Online (Sandbox Code Playgroud)

  • @ClausJørgensen:嗯,只有当你要*确保*你没有从多个线程中调用它时.通常,静态成员应该是线程安全的.`Random`*不是*线程安全的. (3认同)