sirve repetir rango randomize rand que para numeros numero generar funcion decimales crear arreglo aleatorios aleatorio c# performance createfile

c# - repetir - randomize en c



Creando un archivo aleatorio en C# (5)

Bueno, una solución muy simple:

byte[] data = new byte[sizeInMb * 1024 * 1024]; Random rng = new Random(); rng.NextBytes(data); File.WriteAllBytes(fileName, data);

Una versión un poco más eficiente de la memoria :)

// Note: block size must be a factor of 1MB to avoid rounding errors :) const int blockSize = 1024 * 8; const int blocksPerMb = (1024 * 1024) / blockSize; byte[] data = new byte[blockSize]; Random rng = new Random(); using (FileStream stream = File.OpenWrite(fileName)) { // There for (int i = 0; i < sizeInMb * blocksPerMb; i++) { rng.NextBytes(data); stream.Write(data, 0, data.Length); } }

Sin embargo, si lo hace varias veces en una sucesión muy rápida creando una nueva instancia de Random cada vez, puede obtener datos duplicados. Consulte mi artículo sobre aleatoriedad para obtener más información; puede evitarlo utilizando System.Security.Cryptography.RandomNumberGenerator ... o reutilizando la misma instancia de Random varias veces, con la advertencia de que no es seguro para subprocesos.

Estoy creando un archivo de un tamaño específico, no me importa qué datos se encuentren en él, aunque aleatorio sería bueno. Actualmente estoy haciendo esto:

var sizeInMB = 3; // Up to many Gb using (FileStream stream = new FileStream(fileName, FileMode.Create)) { using (BinaryWriter writer = new BinaryWriter(stream)) { while (writer.BaseStream.Length <= sizeInMB * 1000000) { writer.Write("a"); //This could be random. Also, larger strings improve performance obviously } writer.Close(); } }

Esto no es eficiente o incluso la forma correcta de hacerlo. ¿Soluciones de alto rendimiento?

Gracias por todas las respuestas.

Editar

Corrí algunas pruebas en los siguientes métodos para un archivo de 2Gb (tiempo en ms):

Método 1: Jon Skeet

byte[] data = new byte[sizeInMb * 1024 * 1024]; Random rng = new Random(); rng.NextBytes(data); File.WriteAllBytes(fileName, data);

N / A - Excepción de memoria insuficiente para archivos de 2 Gb

Método 2: Jon Skeet

byte[] data = new byte[8192]; Random rng = new Random(); using (FileStream stream = File.OpenWrite(fileName)) { for (int i = 0; i < sizeInMB * 128; i++) { rng.NextBytes(data); stream.Write(data, 0, data.Length); } }

@ 1K - 45,868, 23,283, 23,346

@ 128K - 24,877, 20,585, 20,716

@ 8Kb - 30,426, 22,936, 22,936

Método 3: Hans Passant (Super rápido pero los datos no son aleatorios)

using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None)) { fs.SetLength(sizeInMB * 1024 * 1024); }

257, 287, 3, 3, 2, 3, etc.


La forma eficiente de crear un archivo grande:

FileStream fs = new FileStream(@"C:/temp/out.dat", FileMode.Create); fs.Seek(1024 * 6, SeekOrigin.Begin); System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); fs.Write(encoding.GetBytes("test"), 0, 4); fs.Close();

Sin embargo, este archivo estará vacío (a excepción de la "prueba" al final). No está claro qué es exactamente lo que está intentando hacer: un archivo grande con datos, o simplemente un archivo grande. También puede modificar esto para escribir algunos datos en el archivo, pero sin rellenarlos completamente. Si desea que todo el archivo se llene con datos aleatorios, entonces la única manera que se me ocurre es usar los bytes aleatorios de Jon arriba.


No hay una manera más rápida de aprovechar el soporte de archivos dispersos integrado en NTFS, el sistema de archivos para Windows utilizado en los discos duros. Este código crea un archivo de un gigabyte en una fracción de segundo:

using System; using System.IO; class Program { static void Main(string[] args) { using (var fs = new FileStream(@"c:/temp/onegigabyte.bin", FileMode.Create, FileAccess.Write, FileShare.None)) { fs.SetLength(1024 * 1024 * 1024); } } }

Cuando se lee, el archivo solo contiene ceros.


Puedes usar esta siguiente clase creada por mí para generar cadenas aleatorias

using System; using System.Text; public class RandomStringGenerator { readonly Random random; public RandomStringGenerator() { random = new Random(); } public string Generate(int length) { if (length < 0) { throw new ArgumentOutOfRangeException("length"); } var stringBuilder = new StringBuilder(); for (int i = 0; i < length; i++) { char ch = (char)random.Next(0,255 ); stringBuilder.Append(ch); } return stringBuilder.ToString(); } }

Para usar

int length = 10; string randomString = randomStringGenerator.Generate(length);


Una mejora sería llenar un búfer del tamaño deseado con los datos y vaciarlos todos a la vez.