2015-03-02 2 views
2

Используйте это, Rx генерирует ряд случайных чисел от 0 до 99.Может ли Reactive Extension захватывать/обнаруживать последовательные случаи?

var R = new Random(); 
var ints = Observable.Interval(TimeSpan.FromSeconds(1)); 
var RandomNos = ints.Select(i=> R.Next(100)); // was new Random().Next(100) 
RandomNos.Subscribe(r=> Console.Write(r+ ",")); 

1,75,49,23,97,71,45,19,93,66,40,14,88,62,36,10,84 

Я хочу, чтобы захватить/обнаружить, когда я получаю 6 больше, чем 50 числа в ряд. Может ли Rx сделать это?

RandomNos.?????() 
.Subscribe(l=> Console.WriteLine ("You got 6 more-than-50 numbers in a row")); 
+3

Нельзя постоянно создавать новые экземпляры «Случайные». Вместо этого создайте его и назовите его «Далее». – Servy

+0

спасибо @Servy, изменен. – Rm558

ответ

4

Один из способов сделать это с помощью метода Buffer.

var random = new Random(); 
var result = Observable.Interval(TimeSpan.FromSeconds(1)) 
    .Select(i => random.Next(100)) 
    .Buffer(6, 1) 
    .Where(buffer => buffer.All(n => n > 50)) 

Если вместо 6-в-ряд вы пытаетесь обнаружить K -в-ряд, где K действительно был действительно огромный, то вы, вероятно, хотите сделать что-то с помощью Window вместо этого, но так как K = 6, то проще всего сделать то, что я предложил.

Кроме того, помните, что вероятность того, что число, нарисованное равномерно от {0, 1, ..., 99} больше 50, равно 49/100, а не 1/2.

2

Просто для забавы, здесь используется только один счетчик для любого «n» в строке - он поддерживает количество циклов, превышающее 50 - Take(1) завершает поток при первом вхождении.

RandomNos.Scan(0, (a,x) => x > 50 ? ++a : 0) 
     .Where(x => x == 6) 
     .Take(1) 
     .Subscribe(_ => Console.WriteLine("You got 6 more-than-50 numbers in a row")); 
+0

Обратите внимание, что ответ Тима - O (1) в памяти тоже. – Servy

+0

Ответ Тима также O (1) в этом отношении. – Servy

+0

Ему нужен буфер размера [0,6]. Это O (1), потому что размер буфера всегда меньше постоянной (6). – Servy

Смежные вопросы