Existe una mejor manera de generar 3 dígitos del número al azar de la siguiente manera:

var now = DateTime.Now.Ticks.ToString(CultureInfo.InvariantCulture);
string my3digitrandomnumber = now.Substring(now.Length - 7, 3);

Gracias..

¿Qué tipo de distribución ¿quieres? ¿Desea obtener 007?
Información de fecha y hora no es al azar. Esto está fuertemente ligado a la fecha y hora actual 🙂 Consulte msdn.microsoft.com/en-us/library/system.random.aspx para algo mejor.
001, 010, 100, todas deben estar bien..

OriginalEl autor dotnet-practitioner | 2013-01-22

5 Comentarios

  1. 19

    Sí – su código actual no es azar a todos. Se basa en la hora del sistema. En particular, si se utiliza este de varios hilos al mismo tiempo – o incluso varias veces en el mismo hilo en rápida sucesión – obtendrás el mismo número de cada tiempo.

    Usted debe utilizar al Azar o RandomNumberGenerator (que es más seguro).

    Por ejemplo, una vez que tienes una instancia de Random, puedes usar:

    int value = rng.Next(1000);
    string text = value.ToString("000");

    (Eso suponiendo que se desea que los dígitos de texto. Si quieres un entero que está garantizado para ser de tres dígitos, utilice rng.Next(100, 1000).)

    Sin embargo, hay advertencias en torno a Random:

    • Que no desea crear una nueva instancia cada vez que la utilice; que también estaría basado en el tiempo a menos que se especifique una semilla
    • No es thread-safe

    Idealmente, usted probablemente querrá uno por cada subproceso. Mi artículo sobre la aleatoriedad habla más acerca de este y le da algo de código de ejemplo.

    Pero, ¿qué hace la clase al Azar hacer otra cosa?
    Se mantiene el estado entre las llamadas. Para que inicialmente crear hacerlo con una semilla o con la hora actual, pero después de que el tiempo es irrelevante.

    OriginalEl autor Jon Skeet

  2. 4

    Puede utilizar el Random clase y llamar a Next(10) tres veces.

    O tal vez Next(900) + 100
    SLaks.. puedo obtener el código de ejemplo por favor?
    que nunca iba a regresar 000-099?
    Ah sí, cuando pienso en número de 3 dígitos, creo que 100-999. Supongo que eso es sólo conmigo.

    OriginalEl autor SLaks

  3. 4
    int r = (new Random()).Next(100, 1000);
    Tenga en cuenta que el segundo parámetro de Random.Next es exclusiva, por lo que debe ser Next(100, 1000).
    Sí, tienes razón, gracias.
    new Random() en la misma línea no es una buena idea. Llame dos veces rápidamente puede conseguir el mismo «random» de valor.
    Que sólo sería un problema si su llamado varias veces en el mismo segundo ( por ejemplo, un bucle for ).
    Sí. Eso es lo que yo estoy diciendo «Llamar dos veces rápidamente». Una vez que el segundo está bien, la semilla es, probablemente, generados a partir de milisegundos por lo menos.

    OriginalEl autor Lee

  4. 2

    Bien, en primer lugar, la extraña configuración que tienes, ¿por qué usted obtener antes la fecha?

    Debe utilizar esto para obtener un número de 3 dígitos (menos de 1000).

    Random rand = new Random(); //<-- Make this static somewhere
    
    const int maxValue = 999;
    string number = rand.Next(maxValue + 1).ToString("D3"); 

    La maxValue + 1 es debido a que el parámetro para Random.Next(int) es un exclusivo límite superior, lo que significa que el número devuelto siempre será menor que el parámetro. Nunca puede ser igual a ella.

    Puesto que usted está creando una nueva Random cada vez que esto es casi tan malo como el uso de la fecha.
    Bueno, eso depende de cómo a menudo se llama a la función. He cambiado de todos modos, desde que estoy de acuerdo es una buena práctica.
    Si el intervalo en el que se llama a la función es realmente «al azar» a continuación el código en el OP va a funcionar bien.
    Punto justo.

    OriginalEl autor antonijn

  5. -1
    new Random.NextDouble() * 1000
    podría valores de retorno < 100, que no son 3 dígitos de largo.

    OriginalEl autor mfeingold

Dejar respuesta

Please enter your comment!
Please enter your name here