র্যান্ডম গাউসিয়ান ভেরিয়েবলস


118

.NET এর স্ট্যান্ডার্ড লাইব্রেরিতে এমন কোন শ্রেণি রয়েছে যা গাউসীয় বিতরণ অনুসরণ করে এলোমেলো ভেরিয়েবলগুলি তৈরি করতে আমাকে কার্যকারিতা দেয়?


http://mathworld.wolfram.com/Box-MullerTransformation.html দুটি র্যান্ডম ভেরিয়েবল ব্যবহার করে, আপনি গাউসীয় বিতরণ বরাবর এলোমেলো মান তৈরি করতে পারেন। এটি মোটেই কঠিন কাজ নয়।
জারেট মায়ার

1
আমি কেবল একটি গাণিতিক ফলাফল যুক্ত করতে চাই যা সাধারণ বিতরণ (জটিল সিডিএফের কারণে) জন্য তাত্ক্ষণিকভাবে কার্যকর হয় না তবে এটি অন্যান্য অনেক বিতরণের জন্যও কার্যকর। আপনি যদি Random.NextDouble()কোনও বিতরণের সিডিএফের বিপরীতে [0,1] (সহ ) এ অভিন্ন বিতরণ করা এলোমেলো সংখ্যা রাখেন তবে আপনি যে বন্টন অনুসরণ করবে এলোমেলো নম্বর পাবেন। যদি আপনার অ্যাপ্লিকেশনটির যথাযথভাবে সাধারণভাবে বিতরণ করা ভেরিয়েবলগুলির প্রয়োজন না হয়, তবে লজিস্টিক বিতরণ স্বাভাবিকের খুব কাছাকাছি এবং এটি একটি সহজেই পাল্টে যেতে পারে সিডিএফ।
ওজাহ

1
MedallionRandom NuGet প্যাকেজ A থেকে স্বাভাবিকভাবে বিতরণ মান পুনরুদ্ধারের জন্য একটি এক্সটেনশন পদ্ধতি রয়েছে Randomবক্স-মুলার রুপান্তর ব্যবহার (নীচে বিভিন্ন উত্তর উল্লেখিত)।
চেসমেডালিয়ন

উত্তর:


181

বক্স-মুলার ট্রান্সফর্ম ব্যবহার করার জন্য জ্যারেটের পরামর্শটি দ্রুত এবং নোংরা সমাধানের জন্য ভাল। একটি সহজ বাস্তবায়ন:

Random rand = new Random(); //reuse this if you are generating many
double u1 = 1.0-rand.NextDouble(); //uniform(0,1] random doubles
double u2 = 1.0-rand.NextDouble();
double randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) *
             Math.Sin(2.0 * Math.PI * u2); //random normal(0,1)
double randNormal =
             mean + stdDev * randStdNormal; //random normal(mean,stdDev^2)

3
আমি এটি পরীক্ষা করেছি এবং ম্যাথনেটের মার্সেন টুইস্টার আরএনজি এবং নরমাল ডিস্ট্রিবিউশনের সাথে তুলনা করেছি। আপনার সংস্করণ দ্বিগুণের বেশি দ্রুত এবং শেষ ফলাফলটি মূলত একই ("ঘণ্টা" এর ভিজ্যুয়াল পরিদর্শন)।
জোহান জেরেল

4
@ জোহান, আপনি যদি খাঁটি গতির সন্ধান করেন তবে জিগোরাত অ্যালগরিদমকে সাধারণত দ্রুততম পদ্ধতির হিসাবে স্বীকৃতি দেওয়া হয়। তদুপরি উপরোক্ত পদ্ধতিটি একটি কল থেকে অন্য কলটিতে একটি মূল্য বহন করে দ্রুত তৈরি করা যেতে পারে।
ড্রয় নোকস

হাই, stdDevভেরিয়েবলটি কি সেট করা উচিত ? আমি বুঝতে পারি যে এটি নির্দিষ্ট প্রয়োজনীয়তার সাথে কনফিগার করা যেতে পারে, তবে কোনও সীমা রয়েছে (অর্থাত্ সর্বোচ্চ / মিনিটের মান)?
hofnarwillie

@ hofnarwillie stdDev হল সাধারণ বিতরণের স্কেল প্যারামিটার, যা কোনও ধনাত্মক সংখ্যা হতে পারে। এটি যত বড়, উত্পন্ন সংখ্যাগুলি তত বেশি ছত্রভঙ্গ হবে। একটি স্ট্যান্ডার্ড সাধারণ বিতরণের জন্য প্যারামিটারের অর্থ = 0 এবং স্টডিডিভ = 1।
yoyoyoyosef

1
@ জ্যাক আমি এটি মনে করি না। শুধুমাত্র -2 * ম্যাথ.লগ (u1) স্কয়ারটির ভিতরে রয়েছে এবং লগটি সর্বদা নেগেটিভ বা শূন্য হবে u1 <= 1
yoyoyoyosef 29:58

62

এই প্রশ্নটি .NET গাওসিয়ান প্রজন্মের জন্য গুগলের শীর্ষে চলে গেছে বলে মনে হয়েছে, তাই আমি অনুভব করেছি যে আমি একটি উত্তর পোস্ট করব।

আমি । নেট র্যান্ডম ক্লাসের জন্য কিছু এক্সটেনশন পদ্ধতি তৈরি করেছি , যার মধ্যে বক্স-মুলার রূপান্তর বাস্তবায়ন রয়েছে। যেহেতু সেগুলি এক্সটেনশান, তাই যতক্ষণ না প্রকল্পটি অন্তর্ভুক্ত থাকে (বা আপনি সংকলিত ডিএলএল উল্লেখ করেছেন), আপনি এখনও করতে পারেন

var r = new Random();
var x = r.NextGaussian();

আশা করি কেউ নির্লজ্জ প্লাগকে কিছু মনে করবেন না।

ফলাফলের নমুনা হিস্টোগ্রাম (এটি আঁকার জন্য একটি ডেমো অ্যাপ্লিকেশন অন্তর্ভুক্ত করা হয়েছে):

এখানে চিত্র বর্ণনা লিখুন


আপনার এক্সটেনশন ক্লাসে কয়েকটি জিনিস আমি সন্ধান করছি! ধন্যবাদ!
টমাস

1
আপনার নেক্সটগাউস পদ্ধতিতে আপনার একটি ছোট বাগ রয়েছে। NextDouble () 0.0 এর চেয়ে বেশি বা সমান এবং 1.0 এর চেয়ে কম এলোমেলো ভাসমান-পয়েন্ট নম্বর প্রদান করে। সুতরাং আপনার u1 = 1.0 হওয়া উচিত - NextDouble () .... অন্যান্য লগ (0) উড়িয়ে দেবে
মিচ গম

21

ম্যাথ.নেট এই কার্যকারিতা সরবরাহ করে। এখানে কীভাবে:

double mean = 100;
double stdDev = 10;

MathNet.Numerics.Distributions.Normal normalDist = new Normal(mean, stdDev);
double randomGaussianValue=   normalDist.Sample();

আপনি ডকুমেন্টেশন এখানে পেতে পারেন: http://numerics.mathdotnet.com/api/MathNet.Numerics.Distributions/Normal.htm


দুর্দান্ত উত্তর! এই ফাংশনটি ম্যাথনেট.নুমারিকস প্যাকেজে নুগেটে উপলব্ধ । আপনার নিজের রোল না করতে সর্বদা দুর্দান্ত।
jpmc26

8

আমি মাইক্রোসফ্ট কানেক্টে এই জাতীয় বৈশিষ্ট্যের জন্য একটি অনুরোধ তৈরি করেছি। এটি যদি আপনি খুঁজছেন এমন কিছু হয় তবে দয়া করে এটির জন্য ভোট দিন এবং এর দৃশ্যমানতা বৃদ্ধি করুন।

https://connect.microsoft.com/VisualStudio/feedback/details/634346/guassian-normal-distribution-random-numbers

এই বৈশিষ্ট্যটি জাভা এসডিকে অন্তর্ভুক্ত করা হয়েছে। ডকুমেন্টেশনের অংশ হিসাবে এর বাস্তবায়ন উপলব্ধ এবং সহজেই সি # বা অন্যান্য। নেট ভাষায় পোর্ট করা হয়।

আপনি যদি খাঁটি গতির সন্ধান করেন তবে জিগোর্যাট অ্যালগরিদম সাধারণত দ্রুততম পদ্ধতির হিসাবে স্বীকৃত।

যদিও আমি এই বিষয়টিতে বিশেষজ্ঞ নই - আমি আমার রোবকআপ থ্রিডি সিমুলেটেড রোবোটিক সকার লাইব্রেরির জন্য একটি কণা ফিল্টার প্রয়োগ করার সময় এটির প্রয়োজনীয়তা অর্জন করেছি এবং যখন এটি ফ্রেমওয়ার্কটিতে অন্তর্ভুক্ত করা হয়নি তখন অবাক হয়েছি ।


এরই মধ্যে, এখানে একটি মোড়কের জন্য Randomবক্স মুলার পোলার পদ্ধতির কার্যকর প্রয়োগ সরবরাহ করে:

public sealed class GaussianRandom
{
    private bool _hasDeviate;
    private double _storedDeviate;
    private readonly Random _random;

    public GaussianRandom(Random random = null)
    {
        _random = random ?? new Random();
    }

    /// <summary>
    /// Obtains normally (Gaussian) distributed random numbers, using the Box-Muller
    /// transformation.  This transformation takes two uniformly distributed deviates
    /// within the unit circle, and transforms them into two independently
    /// distributed normal deviates.
    /// </summary>
    /// <param name="mu">The mean of the distribution.  Default is zero.</param>
    /// <param name="sigma">The standard deviation of the distribution.  Default is one.</param>
    /// <returns></returns>
    public double NextGaussian(double mu = 0, double sigma = 1)
    {
        if (sigma <= 0)
            throw new ArgumentOutOfRangeException("sigma", "Must be greater than zero.");

        if (_hasDeviate)
        {
            _hasDeviate = false;
            return _storedDeviate*sigma + mu;
        }

        double v1, v2, rSquared;
        do
        {
            // two random values between -1.0 and 1.0
            v1 = 2*_random.NextDouble() - 1;
            v2 = 2*_random.NextDouble() - 1;
            rSquared = v1*v1 + v2*v2;
            // ensure within the unit circle
        } while (rSquared >= 1 || rSquared == 0);

        // calculate polar tranformation for each deviate
        var polar = Math.Sqrt(-2*Math.Log(rSquared)/rSquared);
        // store first deviate
        _storedDeviate = v2*polar;
        _hasDeviate = true;
        // return second deviate
        return v1*polar*sigma + mu;
    }
}

যদিও আমি এর থেকে কিছু মূল্য পেয়েছি। কেউ কি ভুল করতে পারে?
এম কে 7

@ এমকে,, শূন্যকে কেন্দ্র করে একটি গাউসিয়ান সম্ভাব্যতা ফাংশন যেমন ইতিবাচক মান দেয় ঠিক তেমন নেতিবাচক মান দেয়।
ড্রয় নোকস

তুমি ঠিক বলছো! যেহেতু আমি গাউসিয়ান পিডিএফ সহ একটি সাধারণ জনগোষ্ঠীর ওজনের একটি তালিকা পেতে চাই, তাই আমি মুঃ সেট করে বলি, 75 [কেজি] এবং সিগমা 10-এ তৈরি করার জন্য আমাকে কি গাউসিয়ান র্যান্ডমের নতুন উদাহরণ স্থাপন করতে হবে? প্রতিটি এলোমেলো ওজন?
এম কে 7

আপনি উদাহরণগুলি থেকে নমুনাগুলি আঁকতে পারেন।
ড্রয় নোকস

5

ম্যাথ.নেট আইরিডিয়াম "অ-ইউনিফর্ম র্যান্ডম জেনারেটর (সাধারণ, পোয়েসন, দ্বিপদী, ...)" প্রয়োগ করারও দাবি করে।


তবে এটি সঠিকভাবে কাজ করছে না। এটি চক্রান্ত করার চেষ্টা করা, ইউনিফর্ম এলোমেলো নম্বর দেওয়া।
নিখিল চিলওয়ান্ট

4

স্বাভাবিক বিতরণ করা এলোমেলো ভেরিয়েবল উত্পন্ন করার জন্য এখানে আরও একটি দ্রুত এবং নোংরা সমাধান । এটি কিছু এলোমেলো পয়েন্ট আঁকা (x, y) এবং এটি পরীক্ষা করে যদি এটি আপনার সম্ভাব্যতা ঘনত্ব ফাংশনের কার্ভের নিচে থাকে, অন্যথায় পুনরাবৃত্তি করুন।

বোনাস: আপনি অন্য কোন বন্টন (যেমন জন্য র্যান্ডম ভেরিয়েবল তৈরি করতে পারেন সূচকীয় বণ্টনের বা পইসন বিতরণের শুধু ঘনত্ব ফাংশন প্রতিস্থাপন দ্বারা)।

    static Random _rand = new Random();

    public static double Draw()
    {
        while (true)
        {
            // Get random values from interval [0,1]
            var x = _rand.NextDouble(); 
            var y = _rand.NextDouble(); 

            // Is the point (x,y) under the curve of the density function?
            if (y < f(x)) 
                return x;
        }
    }

    // Normal (or gauss) distribution function
    public static double f(double x, double μ = 0.5, double σ = 0.5)
    {
        return 1d / Math.Sqrt(2 * σ * σ * Math.PI) * Math.Exp(-((x - μ) * (x - μ)) / (2 * σ * σ));
    }

গুরুত্বপূর্ণ: ব্যবধান নির্বাচন Y এবং পরামিতি σ এবং μ যাতে ফাংশনের বক্ররেখা এটা সর্বোচ্চ / সর্বনিম্ন বিন্দুতে কর্তক নয় (যেমন এক্স = গড় এ)। অন্তর চিন্তা এক্স এবং ওয়াই একটি সীমান্ত বক্স, যা বক্ররেখা মাপসই আবশ্যক হিসাবে।


4
ট্যানজেনিয়াল, তবে এটি প্রথমবার বুঝতে পেরেছি যে আপনি _ সিগমা বা _ফির মতো বোবা পরিবর্তে ভেরিয়েবলের জন্য ইউনিকোড প্রতীক ব্যবহার করতে পারেন ...
স্লোথারিও

@ স্লোথারিও আমি 'বোবা কিছু' ব্যবহার করার জন্য সর্বত্র বিকাশকারীদের ধন্যবাদ জানাই: |
ব্যবহারকারী 2864740

2

আমি @ yoyoyoyosef এর উত্তরটিকে আরও দ্রুত তৈরি করে এবং একটি র‌্যাপার ক্লাস লিখে আরও প্রসারিত করতে চাই। ওভারহেড ব্যয় করা অর্থ দ্বিগুণ দ্রুত নাও হতে পারে তবে আমি মনে করি এটি প্রায় দ্বিগুণ দ্রুত হওয়া উচিত । যদিও এটি থ্রেড-নিরাপদ নয়।

public class Gaussian
{
     private bool _available;
     private double _nextGauss;
     private Random _rng;

     public Gaussian()
     {
         _rng = new Random();
     }

     public double RandomGauss()
     {
        if (_available)
        {
            _available = false;
            return _nextGauss;
        }

        double u1 = _rng.NextDouble();
        double u2 = _rng.NextDouble();
        double temp1 = Math.Sqrt(-2.0*Math.Log(u1));
        double temp2 = 2.0*Math.PI*u2;

        _nextGauss = temp1 * Math.Sin(temp2);
        _available = true;
        return temp1*Math.Cos(temp2);
     }

    public double RandomGauss(double mu, double sigma)
    {
        return mu + sigma*RandomGauss();
    }

    public double RandomGauss(double sigma)
    {
        return sigma*RandomGauss();
    }
}

2

@ নোকস এবং @ হামিরের উত্তরগুলি প্রসারিত করে, আমি একটি 'গাউসিয়ান' শ্রেণিও প্রয়োগ করেছি, তবে স্মৃতির স্থান সহজ করার জন্য, আমি এটিকে এলোমেলো শ্রেণির একটি শিশু হিসাবে তৈরি করেছি যাতে আপনি বেসিক নেক্সট (), নেক্সটডাবল () , ইত্যাদি গাউসিয়ান ক্লাসের পাশাপাশি এটিকে পরিচালনা করার জন্য কোনও অতিরিক্ত র্যান্ডম অবজেক্ট তৈরি না করেই। এই ক্লাসটি উদাহরণ ভিত্তিক হওয়ার কারণে আমি এগুলি প্রয়োজনীয় হিসাবে দেখিনি, কারণ আমি _ উপলভ্য, এবং _নিগস্টগ্যাস ক্লাসের বৈশিষ্ট্যগুলিও মুছে ফেলেছি, এটি থ্রেড-নিরাপদ হওয়া উচিত, যদি আপনি প্রতিটি থ্রেডকে নিজস্ব গাউসিয়ান বস্তু দেন। আমি রান-টাইম বরাদ্দকৃত সমস্ত ভেরিয়েবলগুলিও ফাংশন থেকে সরিয়ে নিয়ে সেগুলি শ্রেণীর বৈশিষ্ট্য হিসাবে তৈরি করেছি, এটি মেমোরি ম্যানেজারের কলগুলির সংখ্যা হ্রাস করবে কারণ 4 ডাবল তাত্ত্বিকভাবে অবৈধভাবে ধ্বংস না হওয়া অবধি তাত্ত্বিকভাবে কখনই ডি-বরাদ্দ করা উচিত নয়।

public class Gaussian : Random
{

    private double u1;
    private double u2;
    private double temp1;
    private double temp2;

    public Gaussian(int seed):base(seed)
    {
    }

    public Gaussian() : base()
    {
    }

    /// <summary>
    /// Obtains normally (Gaussian) distrubuted random numbers, using the Box-Muller
    /// transformation.  This transformation takes two uniformly distributed deviates
    /// within the unit circle, and transforms them into two independently distributed normal deviates.
    /// </summary>
    /// <param name="mu">The mean of the distribution.  Default is zero</param>
    /// <param name="sigma">The standard deviation of the distribution.  Default is one.</param>
    /// <returns></returns>

    public double RandomGauss(double mu = 0, double sigma = 1)
    {
        if (sigma <= 0)
            throw new ArgumentOutOfRangeException("sigma", "Must be greater than zero.");

        u1 = base.NextDouble();
        u2 = base.NextDouble();
        temp1 = Math.Sqrt(-2 * Math.Log(u1));
        temp2 = 2 * Math.PI * u2;

        return mu + sigma*(temp1 * Math.Cos(temp2));
    }
}

স্থানীয় ভেরিয়েবলগুলিও বন্ধু।
ব্যবহারকারী 2864740

1

ড্র-নোকসের উত্তরটি প্রসারিত করে, আপনার যদি বাক্স-মুলার (প্রায় 50-75% দ্রুত) এর চেয়ে ভাল পারফরম্যান্সের প্রয়োজন হয়, কলিন গ্রিন সি # তে জিগগারেট অ্যালগরিদমের একটি বাস্তবায়ন ভাগ করেছেন, যা আপনি এখানে পেতে পারেন:

http://heliosphan.org/zigguratalgorithm/zigguratalgorithm.html

জিগগ্রাট বক্ররেখা থেকে যথেষ্ট দূরে পড়ে এমন মানগুলি পরিচালনা করতে একটি সারণী ব্যবহার করে যা এটি দ্রুত গ্রহণ বা প্রত্যাখ্যান করবে। সময়ের প্রায় 2.5% এর মধ্যে, একটি সংখ্যাটি বক্ররেখার কোন দিকে রয়েছে তা নির্ধারণ করতে এটি আরও গণনা করতে হয়।


0

আপনি Infer.NET চেষ্টা করতে পারেন। এটি এখনও বাণিজ্যিক লাইসেন্সবিহীন নয়। এখানে লিঙ্ক আছে

এটি নেট জন্য আমার মাইক্রোসফ্ট গবেষণা বিকাশ একটি সম্ভাব্য কাঠামো। তাদের কাছে বের্নোল্লি, বিটা, গামা, গাউসিয়ান, পোইসন বিতরণের জন্য নেট ধরণের রয়েছে এবং সম্ভবত আমি আরও কিছু রেখেছিলাম।

এটি আপনি যা চান তা অর্জন করতে পারে। ধন্যবাদ।


0

এটি আমার সহজ বক্স মুলার অনুপ্রেরণামূলক বাস্তবায়ন। আপনার প্রয়োজন অনুসারে আপনি রেজোলিউশন বাড়িয়ে নিতে পারেন। যদিও এটি আমার পক্ষে দুর্দান্ত কাজ করে, এটি একটি সীমিত পরিসরের আনুমানিকতা, তাই লেজগুলি বন্ধ এবং সসীম মনে রাখবেন তবে অবশ্যই আপনি প্রয়োজন হিসাবে সেগুলি প্রসারিত করতে পারেন।

    //
    // by Dan
    // islandTraderFX
    // copyright 2015
    // Siesta Key, FL
    //    
// 0.0  3231 ********************************
// 0.1  1981 *******************
// 0.2  1411 **************
// 0.3  1048 **********
// 0.4  810 ********
// 0.5  573 *****
// 0.6  464 ****
// 0.7  262 **
// 0.8  161 *
// 0.9  59 
//Total: 10000

double g()
{
   double res = 1000000;
   return random.Next(0, (int)(res * random.NextDouble()) + 1) / res;
}

public static class RandomProvider
{
   public static int seed = Environment.TickCount;

   private static ThreadLocal<Random> randomWrapper = new ThreadLocal<Random>(() =>
       new Random(Interlocked.Increment(ref seed))
   );

   public static Random GetThreadRandom()
   {
       return randomWrapper.Value;
   }
} 

এটি আমার সহজ বক্স মুলার অনুপ্রেরণামূলক বাস্তবায়ন। আপনার প্রয়োজন অনুসারে আপনি রেজোলিউশন বাড়িয়ে নিতে পারেন। এটি খুব দ্রুত, সহজ এবং আমার নিউরাল নেট অ্যাপ্লিকেশনের জন্য কাজ করে যার কাজটি পেতে আনুমানিক গাউসিয়ান ধরণের সম্ভাবনার ঘনত্ব ফাংশন প্রয়োজন। আশা করি এটি কাউকে সময় এবং সিপিইউ চক্র বাঁচাতে সহায়তা করে। যদিও এটি আমার পক্ষে দুর্দান্ত কাজ করে, এটি একটি সীমিত পরিসরের আনুমানিকতা, তাই লেজগুলি বন্ধ এবং সসীম মনে রাখবেন তবে অবশ্যই আপনি প্রয়োজন হিসাবে সেগুলি প্রসারিত করতে পারেন।
ড্যানিয়েল হাওয়ার্ড

1
ওহে ড্যানিয়েল, আমি এমন একটি সম্পাদনার পরামর্শ দিয়েছি যা আপনার মন্তব্য থেকে বর্ণিত উত্তরের উত্তরে অন্তর্ভুক্ত করে। এটি '//' সরিয়ে দেয় যা আপনার উত্তরে আসল কোডটি মন্তব্য করেছিল। আপনি চাইলে সম্পাদনাটি নিজেই করতে পারেন / যদি তা প্রত্যাখাত হয় :)
এমবিআরআইজি

-1

আমি মনে করি না সেখানে আছে। এবং আমি সত্যিই আশা করি যে কাঠামোগুলি ইতিমধ্যে যথেষ্ট স্ফীত হয়ে গেছে, যেমন বিশেষায়িত কার্যকারিতা আরও বেশি ভরাট না করে।

তৃতীয় পক্ষের জন্য http://www.extremeoptimization.com/Statistics/UserGuide/ContinuousDistributions/NormalDistribation.aspx এবং http://www.vbforums.com/showthread.php?t=488959 এ দেখুন। নেট সমাধান যদিও।


7
গাউসীয় বিতরণ কখন থেকে 'বিশেষায়িত' হয়? এটি এজেএক্স বা ডেটা টেবিলগুলির তুলনায় অনেক বেশি সাধারণ।
ট্রমাপনি

@ ট্রাউমাপনি: আপনি কি নিয়মিত ভিত্তিতে এজেএক্স ব্যবহারের চেয়ে বেশি বিকাশকারী গাউসীয় বিতরণ ব্যবহারের পরামর্শ দেওয়ার জন্য গুরুত্ব সহকারে চেষ্টা করছেন?
ডেভিড আরনো

3
সম্ভবত; আমি যা বলছি তা হ'ল এটি আরও বেশি বিশেষায়িত। এটিতে কেবল একটি ব্যবহার রয়েছে- ওয়েব অ্যাপ্লিকেশন। গাউসীয় বিতরণগুলিতে অবিশ্বাস্য সংখ্যার ব্যবহার রয়েছে।
ট্রমাপনি

@ ডেভিড আর্নো, আপনি কি কম কার্যকারিতা একটি কাঠামো উন্নত করার পরামর্শ দিচ্ছেন?
Jodrell

1
@ জোডরেল, একটি নির্দিষ্ট উদাহরণ উদ্ধৃত করার জন্য, আমি মনে করি যে মূল .NET কাঠামোর অংশের চেয়ে এমভিসিকে একটি আলাদা কাঠামো করার সিদ্ধান্ত নেওয়া ভাল ছিল।
ডেভিড আরনো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.