Rate limit a method by generating particular load on demand in C#
Welcome to CR.  There is a lot of room for improvement with your code.  Let's start with the simple stuff and work our way up.

CR prefers use of braces always with if or for or foreach.

Hungarian Notation is heavily frowned upon, so get rid of names prefaced with m_.

Underscores internal to variable names are also frowned upon, so sleep_time would be better as sleepTime (or better altogether with a different name: see further below).

Names should meaningful and create clarity rather than confusion.  So m_threads isn't the number of threads running, but rather its the number of tasks you will start.  Thus that variable name should have "tasks" in it rather than "threads".

You should place your code into its own class.  For instance, class ThroughputTester.  There would be class level properties or fields named TaskCount, TargetThroughput, and TossesPerSecond.  I would not have these as constant fields, since it makes your code rigid and only applicable to the one set of values.  Rather these could be readonly properties set in the constructor, which allows for experimentation with different sets of values.

You could also have a CreateDefault method to create an instance with the same values as your constants.

public class ThroughputTester
{
    public ThroughputTester(int taskCount, int targetThroughput, int tossesPerSecond)
    {
        TaskCount = taskCount;
        TargetThroughput = targetThroughput;
        TossesPerSecond = tossesPerSecond;
    }

    public int TaskCount { get; }
    public int TargetThroughput { get; }
    public int TossesPerSecond { get; }

    public static ThroughputTester CreateDefault =&gt; new ThroughputTester(100, 2000, 2000);

}


Your use of Random is fragile and runs into issues, particularly since you have it in a method with a loop.  The better usage would be to define the Random instance at the class level instead of inside a method.

sleep_time leaves me wondering what it represents.  Is it seconds or milliseconds?  Can't tell from a vague name like time.  It could be renamed sleepMilliseconds.  Alternatively, you could use the Thread.Sleep(TimeSpan) signature (see link here) along with the TimeSpan.FromMilliseconds or TimeSpan.FromSeconds methods.

That said, even Thread.Sleep has some negativity associated with it.  You should read this answer for Why is Thread.Sleep so harmful.