Câu hỏi liên quan

0 Phiếu
0 Câu trả lời
0 Phiếu
2 Câu trả lời
+1 Phiếu
5 Câu trả lời
+1 Phiếu
6 Câu trả lời
0 Phiếu
0 Câu trả lời

Số ngẫu nhiên với cố định trung bình


0 Phiếu
Đã hỏi 25/5/2016 bởi junBoyan (600 điểm)
Tôi muốn tạo ra 100 số ngẫu nhiên từ 1 đến 10. Nhưng với mức trung bình của những con số ngẫu nhiên 100 nên là 7. Làm thế nào có thể làm điều đó? Tôi đang làm như sau:
//generating random number
Random random = new Random();
int value = random.Next(1,10);
và lưu trữ mỗi value trong một mảng. Nếu trung bình của 100 mục trong mảng đó không phải là 7 sau đó tôi cần để có được một số ngẫu nhiên 100. Bất cứ ai có thể đề nghị một cách tốt hơn để làm điều này?

6 Câu trả lời

0 Phiếu
Đã trả lời 04/6/2016 bởi Efficien (450 điểm)
được bình chọn là câu trả lời hay nhất 06/6/2016 bởi Npg_2281_Dys
 
Câu trả lời hay nhất
public int RandomNumberThatAveragesToSeven()
{
    //Chosen by fair dice roll
    //Guaranteed to be random
    return 7;
}
mà không có tham số bổ sung, điều này trên algorithm đáp ứng mỗi yêu cầu.
  1. trở lại phải trong khoảng từ 1 đến 10
  2. trung bình của nhiều cuộc gọi phải có xu hướng 7 vì n có xu hướng inf.
EDIT vì đã có rất nhiều tranh cãi về câu trả lời này... Tôi gửi câu trả lời này... đó là chắc chắn ngẫu nhiên.
public List<int> ProduceRandom100NumbersWithAverageOfSeven()
{
    var rand = new Random();
    var seed = rand.Next();
    if(seed > 0.5)
    {
        return new List(Enumerable.Concat(
                 Enumerable.Repeat(6, 50),
                 Enumerable.Repeat(8, 50)));
    }
    else
    {
        return new List(Enumerable.Concat(
                 Enumerable.Repeat(8, 50),
                 Enumerable.Repeat(6, 50)));
    }
}
Đã bình luận 06/6/2016 bởi Npg_2281_Dys (172,850 điểm)
Vấn đề này: những con số sẽ không phải ngẫu nhiên như họ nên. Tại sao bạn lại cần trung bình 7?
0 Phiếu
Đã trả lời 04/6/2016 bởi Qrs8117a (570 điểm)
This method generates a random number sequence then keeps adding/subtracting until we get the correct total (700), so long as the number we are altering is still in the range of 1-10
List<int> randomNumbers = new List<int>();
for (int i = 0; i < 100; i++) {
    numbers.Add(r.Next(1, 10));
}
int total = randomNumbers.Sum();
// Now fiddle until we get the correct total (700)
if (total < 700) {
    while (total < 700) {
        for (int i = 0; i < 100; i++) {
            if (numbers[i] < 10) {
                numbers[i]++;
                total = randomNumbers.Sum();
                if (total == 700) break;
            }
        }
    }
}
else if (total > 700) {
    while (total > 700) {
        for (int i = 99; i >= 0; i--) {
            if (numbers[i] > 0) {
                numbers[i]--;
                total = randomNumbers.Sum();
                if (total == 700) break;
            }
        }
    }
}
Đã bình luận 06/6/2016 bởi The_akahi (100 điểm)
-1 là không rõ ràng những gì phân phối mà bạn yêu cầu, chỉ rằng nó không phải rõ ràng là một phân bố đồng đều. Không có nghĩa là vô hạn cách để tạo ra một phân phối phù hợp với yêu cầu của bạn.
0 Phiếu
Đã trả lời 04/6/2016 bởi aikotest (220 điểm)
OK, nó có thể được khôn lanh để làm một cái gì đó như thế. Nếu bạn cần để có được con số khác nhau 100 và bạn cần họ trung bình sẽ có 7, bạn sẽ cần chúng để tổng hợp 700. Bạn sẽ cần phải theo dõi các mỗi số và số tiền của họ. Trong khi 700 trừ đi khoản thu được của bạn cho đến nay giá trị là thấp hơn so với 10 * số tiền của số điện thoại bạn đã không thu được, nhưng bạn có thể tiếp tục lấy giá trị ngẫu nhiên tinh khiết. Khi thời điểm đến số tiền thu được giá trị của bạn là thấp hơn so với các giá trị mà bạn cần để có được, sau đó bạn thay đổi con số cuối đó bằng một 10, đặt một 10 phần còn lại của số lượng bạn cần để kết thúc danh sách của bạn, và trên số cuối cùng, bạn nhận được sự khác biệt giữa 700 và Tổng giá trị 99 ngẫu nhiên giả trước đó của bạn. Shuffle của array et voilá , bạn có một mảng giả ngẫu nhiên 100 với các số từ 1 đến 10 có trung bình là 7. Chắc chắn nó sẽ có nhiều hơn 10s hơn nó sẽ được mong muốn, nhưng chắc chắn bạn sẽ có thể tinh chỉnh này "thuật toán" để làm cho nó một chút ít hơn 10 dễ bị. Mmmm, chờ đợi một thời điểm, nếu bạn nhận được giá trị ngẫu nhiên có trung bình trên 7? Bạn sẽ cần phải theo dõi cũng là tổng của giá trị hiện tại của bạn là thấp hơn so với những con số bạn vẫn chưa có được. Nếu bạn vượt qua này value trong bất cứ lúc nào bạn cần để chuyển đổi số cuối cùng của bạn để một 1, đặt một 1 trên phần còn lại của giá trị cần thiết của bạn và có được lại số cuối cùng của bạn là sự khác biệt giữa 700 và giá trị 99 trước đó của bạn.
Đã bình luận 05/6/2016 bởi CheakIs (100 điểm)
http://StackOverflow.com/questions/ 11149051 /generate-a-random-number-sequence-to-get-and-average-đó là một algorithm tôn trọng phạm vi.
Đã bình luận 06/6/2016 bởi Guler (230 điểm)
Nó không phải là chính xác 7? Bởi vì đó chỉ bao giờ sẽ xảy ra khi tất cả các số thêm đến chính xác 700.
Đã bình luận 06/6/2016 bởi as_hurm (180 điểm)
Như là một thách thức, tạo ra sự phân bố với tối đa shannon entropy với phạm vi nhất định và các giá trị kỳ vọng.
0 Phiếu
Đã trả lời 04/6/2016 bởi verythis (580 điểm)
Điều này là của tôi cách tiếp cận này:
List<int> lst = new List<int>();
            lst.Add(random.Next(1, 11));
            for (int i = 0; i < 100; i++)
            {
                double average = lst.Average();
                int next;
                if (average < 7)
                {
                    next = random.Next(7, 11);
                }
                else if (average > 7)
                {
                    next = random.Next(1, 8);
                }
                else
                {
                    next = random.Next(1, 11);
                }
                lst.Add(next);
            }
trung bình là gần bảy.
Đã bình luận 06/6/2016 bởi Kombe (610 điểm)
@ SomeRandomName các câu hỏi là một chút không rõ ràng. Có lẽ các OP muốn một value thọ của 7, hoặc có lẽ họ muốn tổng số 100 để là 7 * 100.
0 Phiếu
Đã trả lời 04/6/2016 bởi Fbyturli (490 điểm)
public int RandomNumberThatAveragesToSeven()
{
    //Chosen by fair dice roll
    //Guaranteed to be random
    return 7;
}
mà không có tham số bổ sung, điều này trên algorithm đáp ứng mỗi yêu cầu.
  1. trở lại phải trong khoảng từ 1 đến 10
  2. trung bình của nhiều cuộc gọi phải có xu hướng 7 vì n có xu hướng inf.
EDIT vì đã có rất nhiều tranh cãi về câu trả lời này... Tôi gửi câu trả lời này... đó là chắc chắn ngẫu nhiên.
public List<int> ProduceRandom100NumbersWithAverageOfSeven()
{
    var rand = new Random();
    var seed = rand.Next();
    if(seed > 0.5)
    {
        return new List(Enumerable.Concat(
                 Enumerable.Repeat(6, 50),
                 Enumerable.Repeat(8, 50)));
    }
    else
    {
        return new List(Enumerable.Concat(
                 Enumerable.Repeat(8, 50),
                 Enumerable.Repeat(6, 50)));
    }
}
Đã bình luận 05/6/2016 bởi Uni_9989 (440 điểm)
thấy câu hỏi này http://stackoverflow.com/questions/ 17795265 /make-random-numbers-tend-average-to-a-specific-value
Đã bình luận 06/6/2016 bởi amos_yet (100 điểm)
lol những gì bạn làm gì nếu các số ngẫu nhiên đầu tiên vô hạn có thể sẽ không cung cấp cho bạn 7 là trung bình. Lời khuyên thực sự xấu.
–1 Phiếu
Đã trả lời 04/6/2016 bởi barra (1,150 điểm)
My 2 cents
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Stopwatch watch = Stopwatch.StartNew();
            int count = 100;
            Double min = 0;
            Double max = 10;
            Double target = 7;
            Double tolerance = 0.00000001;
            Double minAverage = target - tolerance;
            Double maxAverage = target + tolerance;
            Random r = new Random();
            List<Double> numbers = new List<double>();
            Double sum = 0;
            for (int i = 0; i < count; i++)
            {
                Double d = RangedDouble(min, max, r);
                numbers.Add(d);
                sum += d;
            }

            int Adjustments = 0;
            while((sum / count < minAverage || (sum / count) > maxAverage))
            {
                while ((sum / count) < minAverage)
                {
                    Double oldDbl = numbers.First(d => d < minAverage);
                    Double newDbl = oldDbl + RangedDouble(minAverage - oldDbl, 10 - oldDbl, r);
                    numbers.Remove(oldDbl);
                    sum -= oldDbl;
                    numbers.Add(newDbl);
                    sum += newDbl;
                    Adjustments++;
                }
                while ((sum / count) > maxAverage)
                {
                    Double oldDbl = numbers.First(d => d > maxAverage);
                    Double newDbl = oldDbl - RangedDouble(oldDbl - maxAverage, oldDbl, r);
                    numbers.Remove(oldDbl);
                    sum -= oldDbl;
                    numbers.Add(newDbl);
                    sum += newDbl;
                    Adjustments++;
                }
            }
            watch.Stop();
            int x = 0;
            while (x < count)
            {
                Console.WriteLine("{0:F7}  {1:F7}  {2:F7}  {3:F7}", numbers.Skip(x).Take(1).First(), numbers.Skip(x + 1).Take(1).First(), numbers.Skip(x + 2).Take(1).First(), numbers.Skip(x + 3).Take(1).First());
                x += 4;
            }
            Console.WriteLine();
            Console.WriteLine(watch.ElapsedMilliseconds);
            Console.WriteLine(numbers.Average());
            Console.WriteLine(Adjustments);
            Console.ReadKey(true);
        }
        private static double RangedDouble(Double min, Double max, Random r)
        {
            return (r.NextDouble() * (max - min) + min);
        }
    }
}
And the output:
8.1510368 7.2103030 7.9909210 9.6693311 8.2275382 7.2839244 8.8634567 7.9751014 7.8643791 7.2262462 9.8914455 9.6875690 8.4396683 8.4308401 7.5380218 8.6147181 8.2760663 7.7399011 7.4312152 9.2115622 9.7850111 9.1061378 9.8672965 9.5610411 7.0415607 8.8446195 9.3562218 8.5279759 7.5227340 9.3572417 9.8927997 9.5880645 9.0908564 7.0918394 9.6213258 8.6528169 9.3803283 9.6869223 1.4006790 3.3310691 7.0719214 2.6370854 9.7558776 8.9180391 3.0486700 5.0082988 8.8624504 5.0497899 0.9692377 7.7140550 9.8495115 6.4933865 4.4939760 9.3187625 5.4353003 6.5405668 9.5693118 5.0339998 6.9644440 4.6902072 0.5241568 9.7748420 0.1406617 8.4731427 9.8064604 6.3113773 0.8628048 9.2417028 8.9148867 9.3111336 3.2424080 9.6710544 4.3794982 5.1687718 9.8207783 0.3283217 9.8321869 2.8093698 7.4377070 4.1130959 5.9840738 9.2560763 3.6691865 2.5498863 7.3242246 7.0179332 5.8906831 9.3340545 0.3735044 7.2442886 0.4409532 9.0749754 9.6716409 8.4097246 2.8069123 7.2970794 2.4964238 8.2826350 9.1115787 3.7373927 1 6.99992266645471 729

ToughDev Q&A là gì?

Trang web hỏi đáp cho các bạn đam mê lập trình, phát triển phần mềm và các vấn đề kỹ thuật khác. Với sự giúp đỡ của bạn, chúng tôi hy vọng sẽ xây dựng thành công một thư viện đầy đủ các câu hỏi và trả lời về tất cả các vấn đề có liên quan đến lập trình!







...