|
Страници по тази тема: 1 | 2 | 3 | (покажи всички)
Тема
|
Вероятност
|
|
Автор |
Dijkstra (сектант) |
Публикувано | 30.05.11 15:53 |
|
вероятността да се падне тура е 90%
вероятността да се падне ези е 10%
монетата се хвърля 1000 пъти
каква е вероятността в тези 1000 хвърляния да се падне поредица от 20 или повече тура?
пример:
TETETETETETE .... TTTTTTTTTTTTTTTTTTTT.....TETE - 1000 хвърляния
С долния код на Ц# ми го изкарва 100%
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
namespace ConsoleApplication1
{
class Program
{
// possibility for 1 = 0.9
//possibility for 0 = 0.1
static byte[] thousand = new byte[1000];
static void Fill()
{
byte tmp;
for (int i = 0; i < 1000; i++)
{
tmp =RollDice(10);
if (tmp == 0)
{
thousand = 0;
}
else
{
thousand = 1;
}
}
}
static bool Check()
{
int start = 0;
for (int i = 0; i < 1000; i++)
{
if (thousand == 0)
{
start = 0;
}
else
{
start++;
if (start >= 20)
{
return true;
}
}
}
return false;
}
static void Main()
{
int counter = 0;
for (int i = 0; i < 100000; i++)
{
Fill();
if (Check())
{
counter++;
}
}
Console.WriteLine(counter);
counter = Console.Read();
}
// This method simulates a roll of the dice. The input parameter is the
// number of sides of the dice.
public static byte RollDice(byte numberSides)
{
if (numberSides <= 0)
throw new ArgumentOutOfRangeException("numberSides");
// Create a new instance of the RNGCryptoServiceProvider.
RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();
// Create a byte array to hold the random value.
byte[] randomNumber = new byte[1];
do
{
// Fill the array with a random value.
rngCsp.GetBytes(randomNumber);
}
while (!IsFairRoll(randomNumber[0], numberSides));
// Return the random number mod the number
// of sides. The possible values are zero-
// based, so we add one.
return (byte)((randomNumber[0] % numberSides));
}
private static bool IsFairRoll(byte roll, byte numSides)
{
// There are MaxValue / numSides full sets of numbers that can come up
// in a single byte.
int fullSetsOfValues = Byte.MaxValue / numSides;
// If the roll is within this range of fair values, then we let it continue.
return roll < numSides * fullSetsOfValues;
}
}
}
| |
|
Не знам какво прави програмата, но предполагам, че е от закръгляне. Вероятноста е много близка до 100%. Разликата е след хилядния знак след запетаята, и затова сигурно го закръглява.
| |
|
броя на опитите е твърде малък за да се измери вероятност.
аз написах малко по-оптимизиран алгоритъм за смятане
int test()
{
int seq=0;
for(int i=0;i<1000;i++){
int r=rand()&0xfff;
if(r>0xfff/10)seq++;
else seq=0;
if(seq==20)return i;
}
return 0;
}
int main(){
srand(GetTickCount());
int i,j;
int not=0;
__int64 start=0;
int sn=0;
for(i=0;i<N;i++){
if(j=test()){
start+=j-20;
sn++;
}else not++;
if(i%(N/100)==0)printf("|");;
}
printf("p=%d start:%f\n",not,(double)start/sn);
scanf("%d\n",&i);
и при 100 милиона опита все още няма нито едно събитие, а смята към две минути. ще го пусна на работа на бърз компот с повече опити. разпечатвам и средното място където се намира поредицата, което е някъде към позиция 51.34.
впрочем, разпределението би трябвало да е близко до поасоново и може да се сметне теоретично и да се сравни с резултата от симулацията.
NE SUTOR ULTRA CREPIDAMРедактирано от zaphod на 31.05.11 07:45.
| |
Тема
|
1 милиард опита
[re: zaphod]
|
|
Автор |
zaphod (мракобес) |
Публикувано | 31.05.11 10:31 |
|
и нито един случай. обаче, може да предположим че вероятността да не се случи поредица намалява експоненциално с дължината на поредицата, и измервайки средното място за поява на поредица индиректно да сметнем каква е вероятността. ако това е така, може да очакваме че вероятността е близо едно на три милиарда, което е на границата на това което меря, но ще го пусна обедната почивка с 10 милиарда опита да видим какво ще направи. правя проби сега,
с вероятност 8/9 дава 98 събития за 100 милиона опита, което е 1/милион, при средна поява на позиция 65, хиляда делено на логаритъм от милион е 72, значи
с вероятност 7/8 дава 2930 събития, среден старт на 86, хеляда делено на логаритъма е 95,
с вероятност 6/7 дава старт на 124, по горната формула получавам 134.
странно все пак, човек би помислил че корекцията е 10тина%, което значи че на 50-100 милиона проби трябва да има събитие.
NE SUTOR ULTRA CREPIDAM
| |
|
аз съм съгласен с хариш, че вероятността е близо до 100%. ако вероятността за тура е p, a броя на хвърлянията е n, приблизителна формула за очакваната дължина от поредни тура е -log(n*(1-p))/log(p). за n=1000, p=0.9 очакваме поредица от 40тина поредни тура. вероятността за 20 и повече е близка до единица, не знам що твойта симулация дава подобни резултати
| |
|
че е близка близка е, никой не спори. но колко е близка?
NE SUTOR ULTRA CREPIDAM
| |
|
след като за 0.9 се различаваше твърде силно от очакваното, смених рнд генератора и вече се съгласува добре - 50 на милиард опита.
имам предвид, в оригиналната формулировка вероятността е 1-50/1е9
NE SUTOR ULTRA CREPIDAM
| |
|
Това не е ли от стандартните примери, марковски вериги или не знам си какво. Може да се сметне точно без симулации. Най-малкото би трябвало да може да се напише лесно рекурентна зависимост.
| |
|
аха аз си поислих че ти твърдиш обратното понеже не ми стана ясно какво наричаш "събитие". иначе може да се сметне директно с рекурсивната формула като в (4):
| |
|
Добре си се сетил да смениш рандом генератора. Стандартния rand() не став за симулации. За С++ от boost marsene twistera е добър например.
| |
|
Страници по тази тема: 1 | 2 | 3 | (покажи всички)
|
|
|