private static TData RandomRecord <TData>(Random random, Recorder <TData> recorder, int time)
        {
            // Destroy an old actor randomly
            if (random.NextDouble() < RemoveActorOdds)
            {
                var endTime = random.Next(time, time + RecordInterval);
                var actor   = recorder.Scene.Actors.FirstOrDefault();

                if (actor != null && actor.EndTime < 0)
                {
                    recorder.RemoveActor(actor, endTime);
                }
            }

            // Move exising actor randomly
            foreach (var actor in recorder.Scene.Actors)
            {
                if (random.NextDouble() >= ChangeActorOdds)
                {
                    continue;
                }

                var x = actor.GetVariable <float>(1);
                var y = actor.GetVariable <float>(2);
                var z = actor.GetVariable <float>(3);
                var keyFrameStartTime = random.Next(time, time + RecordInterval);
                var keyFrameEndTime   = keyFrameStartTime + random.Next(1, 1000);

                switch (random.Next(0, 4))
                {
                case 1:         // Linear movement
                    recorder.AddLine(x, keyFrameStartTime, keyFrameEndTime, (float)(random.NextDouble() * 100));
                    recorder.AddLine(y, keyFrameStartTime, keyFrameEndTime, (float)(random.NextDouble() * 100));
                    recorder.AddLine(z, keyFrameStartTime, keyFrameEndTime, (float)(random.NextDouble() * 100));
                    break;

                case 2:         // Step movement
                    recorder.AddStep(x, keyFrameStartTime, keyFrameEndTime, (float)(random.NextDouble() * 100));
                    recorder.AddStep(y, keyFrameStartTime, keyFrameEndTime, (float)(random.NextDouble() * 100));
                    recorder.AddStep(z, keyFrameStartTime, keyFrameEndTime, (float)(random.NextDouble() * 100));
                    break;

                default:         // No movement;
                    break;
                }
            }

            // Create a new actor randomly
            if (random.NextDouble() < CreateActorOdds)
            {
                var startTime = random.Next(time, time + RecordInterval);
                var actor     = recorder.AddActor(startTime, f =>
                {
                    f.AddFloat(1, (float)(random.NextDouble() * 10));
                    f.AddFloat(2, (float)(random.NextDouble() * 10));
                    f.AddFloat(3, (float)(random.NextDouble() * 10));
                });
            }

            return(recorder.Record(time + RecordInterval));
        }