Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用c中的线程用随机数填充数组#_C#_Arrays_Multithreading_Random_Thread Safety - Fatal编程技术网

C# 使用c中的线程用随机数填充数组#

C# 使用c中的线程用随机数填充数组#,c#,arrays,multithreading,random,thread-safety,C#,Arrays,Multithreading,Random,Thread Safety,如图中所述,我试图用16个线程(在我的例子中)用随机数填充一个字节数组,现在用一个线程填充一个500000000字节的数组大约需要6.5秒,所以逻辑上说使用16个线程将至少快10倍,但我试着这样做,填充它花了15秒,我做的是给每个线程一个段来填充相同的数组 代码如下: static byte[] nums2 = new byte[500000000]; static Random rnd = new Random(123); static void

如图中所述,我试图用16个线程(在我的例子中)用随机数填充一个字节数组,现在用一个线程填充一个500000000字节的数组大约需要6.5秒,所以逻辑上说使用16个线程将至少快10倍,但我试着这样做,填充它花了15秒,我做的是给每个线程一个段来填充相同的数组

代码如下:

        static byte[] nums2 = new byte[500000000];
        static Random rnd = new Random(123);
        static void fill()
        {
            for (int i = 0; i < nums.Length; i++)
                nums[i] = (byte)rnd.Next(10);
        }

        static void fillPart(object ID)
        {
            var part = nums2.Length / Environment.ProcessorCount;
            int baseN = (int)ID * part;
            for (int i = baseN; i < baseN + part; i++)
                nums2[i] = (byte)rnd.Next(10);
            Console.WriteLine("Done! " + ID);
        }

        static void Main(string[] args)
        {
            Stopwatch watch = new Stopwatch();
            watch.Start();
            fill();
            watch.Stop();
            Console.WriteLine("it took " + watch.Elapsed);
            Console.WriteLine();

            watch.Reset();
            watch.Start();
            Thread[] threads = new Thread[Environment.ProcessorCount];
            for (int i = 0; i < Environment.ProcessorCount; i++)
            {
                threads[i] = new Thread(fillPart);
                threads[i].Start(i);
            }
            for(int i = 0; i < Environment.ProcessorCount; i++)
                threads[i].Join();

            watch.Stop();
            Console.WriteLine("it took " + watch.Elapsed);
        }
    }```
would like to understand why is it took 15 seconds or maybe what I did wrong
static byte[]nums2=新字节[500000000];
静态随机rnd=新随机(123);
静态空隙填充()
{
对于(int i=0;i
如果是我,我会:

byte[] nums = new byte[500000000];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(nums);
就这样吧

如果您确实需要线程:

RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
var dop = 8;
var batchSize = 500000000 / dop;
var bigBytes = Enumerable.Range(0, dop).AsParallel().SelectMany(t => {
    var bytes = new byte[batchSize];
    rng.GetBytes(bytes); //This *IS* thread-safe
    return bytes;
}).ToArray();

但是我怀疑通过
SelectMany
ToArray
将数据整理到一个新数组所花费的时间可能比单线程方法更昂贵。

问题是您声明了
static Random rnd=new Random(int.MaxValue)
如果在
fillPart
方法中创建
Random
实例,则程序将在一秒钟内完成,因此not
Thread
中的问题是
rnd。下一步(10)

static void fillPart(对象ID)
{            
随机rnd=新随机(123);
var part=nums2.Length/Environment.ProcessorCount;
int baseN=(int)ID*部分;
int co=0;
对于(inti=baseN;i
在多个线程中使用相同的
随机
实例是不安全的。哦,你说得对!它正在工作,只是在fillpart函数中添加了一个新的随机对象。我想知道为什么现在的问题是您可能同时创建了一组随机实例。为了使它们不会全部吐出相同的数字,你必须增加更多的复杂性,以确保它们的种子不同。这是否回答了你的问题?不,非常不!关键是要使用threads@Sinatrcool,我不知道你是如何使用threads的,但是很好!请参阅我上面关于播种随机数以使生成的数组不会重复自身的评论。我认为他的问题不在于唯一数,而在于线程性能。但你是对的,你的评论给了我灵感
        static void fillPart(object ID)
        {            
            Random rnd = new Random(123);

            var part = nums2.Length / Environment.ProcessorCount;
            int baseN = (int)ID * part;
            int co = 0;
            for (int i = baseN; i < baseN + part; i++)
            {
                nums2[i] = (byte)rnd.Next(10);
            }

            //Console.WriteLine("Done! " + ID + co);
        }